]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1065] lease commands update statistics
authorRazvan Becheriu <razvan@isc.org>
Thu, 23 Jul 2020 16:06:49 +0000 (19:06 +0300)
committerRazvan Becheriu <razvan@isc.org>
Wed, 12 Aug 2020 06:56:43 +0000 (09:56 +0300)
src/hooks/dhcp/lease_cmds/lease_cmds.cc
src/hooks/dhcp/lease_cmds/tests/lease_cmds_unittest.cc
src/lib/dhcpsrv/alloc_engine.cc
src/lib/dhcpsrv/lease.cc
src/lib/dhcpsrv/lease.h

index e12ebf73e1477bed63e5ba6e2fec66e096924a4c..e97f4c4e810326e0197e71b11f1ea5a33df7c3b7 100644 (file)
@@ -25,6 +25,7 @@
 #include <lease_cmds.h>
 #include <lease_parser.h>
 #include <lease_cmds_log.h>
+#include <stats/stats_mgr.h>
 #include <util/encode/hex.h>
 #include <util/multi_threading_mgr.h>
 #include <util/strutil.h>
@@ -41,6 +42,7 @@ using namespace isc::dhcp_ddns;
 using namespace isc::config;
 using namespace isc::asiolink;
 using namespace isc::hooks;
+using namespace isc::stats;
 using namespace isc::util;
 using namespace std;
 
@@ -420,6 +422,10 @@ LeaseCmdsImpl::leaseAddHandler(CalloutHandle& handle) {
                 if (!success) {
                     isc_throw(db::DuplicateEntry, "IPv4 lease already exists.");
                 }
+                StatsMgr::instance().addValue(
+                    StatsMgr::generateName("subnet", lease4->subnet_id_,
+                                           "assigned-addresses"),
+                    int64_t(1));
                 resp << "Lease for address " << lease4->addr_.toText()
                      << ", subnet-id " << lease4->subnet_id_ << " added.";
             }
@@ -454,6 +460,11 @@ LeaseCmdsImpl::leaseAddHandler(CalloutHandle& handle) {
                 if (!success) {
                     isc_throw(db::DuplicateEntry, "IPv6 lease already exists.");
                 }
+                StatsMgr::instance().addValue(
+                    StatsMgr::generateName("subnet", lease6->subnet_id_,
+                                           lease6->type_ == Lease::TYPE_NA ?
+                                           "assigned-nas" : "assigned-pds"),
+                    int64_t(1));
                 if (lease6->type_ == Lease::TYPE_NA) {
                     resp << "Lease for address " << lease6->addr_.toText()
                          << ", subnet-id " << lease6->subnet_id_ << " added.";
@@ -1167,6 +1178,10 @@ LeaseCmdsImpl::lease4DelHandler(CalloutHandle& handle) {
 
         if (LeaseMgrFactory::instance().deleteLease(lease4)) {
             setSuccessResponse(handle, "IPv4 lease deleted.");
+            StatsMgr::instance().addValue(StatsMgr::generateName("subnet",
+                                                                 lease4->subnet_id_,
+                                                                 "assigned-addresses"),
+                                          int64_t(-1));
         } else {
             setErrorResponse (handle, "IPv4 lease not found.", CONTROL_RESULT_EMPTY);
         }
@@ -1188,8 +1203,26 @@ namespace { // anonymous namespace.
 
 void updateOrAdd(Lease6Ptr lease) {
     try {
+        Lease6Ptr lease6 =
+            LeaseMgrFactory::instance().getLease6(lease->type_, lease->addr_);
         // Try to update.
         LeaseMgrFactory::instance().updateLease6(lease);
+        bool update = lease6->checkUpdateStats();
+        if (lease6->subnet_id_ != lease->subnet_id_) {
+            StatsMgr::instance().addValue(
+                StatsMgr::generateName("subnet", lease6->subnet_id_,
+                                       lease->type_ == Lease::TYPE_NA ?
+                                       "assigned-nas" : "assigned-pds"),
+                int64_t(-1));
+            update = true;
+        }
+        if (update) {
+            StatsMgr::instance().addValue(
+                StatsMgr::generateName("subnet", lease->subnet_id_,
+                                       lease->type_ == Lease::TYPE_NA ?
+                                       "assigned-nas" : "assigned-pds"),
+                int64_t(1));
+        }
 
     } catch (const NoSuchLease& ex) {
         // Lease to be updated not found, so add it.
@@ -1197,6 +1230,11 @@ void updateOrAdd(Lease6Ptr lease) {
             isc_throw(db::DuplicateEntry,
                       "lost race between calls to update and add");
         }
+        StatsMgr::instance().addValue(
+            StatsMgr::generateName("subnet", lease->subnet_id_,
+                                   lease->type_ == Lease::TYPE_NA ?
+                                   "assigned-nas" : "assigned-pds"),
+            int64_t(1));
     }
 }
 
@@ -1289,6 +1327,11 @@ LeaseCmdsImpl::lease6BulkApplyHandler(CalloutHandle& handle) {
                         // leases.
                         if (LeaseMgrFactory::instance().deleteLease(lease)) {
                             ++success_count;
+                            StatsMgr::instance().addValue(
+                                StatsMgr::generateName("subnet", lease->subnet_id_,
+                                                       lease->type_ == Lease::TYPE_NA ?
+                                                       "assigned-nas" : "assigned-pds"),
+                                int64_t(-1));
 
                         } else {
                             // Lazy creation of the list of leases which failed to delete.
@@ -1451,6 +1494,11 @@ LeaseCmdsImpl::lease6DelHandler(CalloutHandle& handle) {
 
         if (LeaseMgrFactory::instance().deleteLease(lease6)) {
             setSuccessResponse(handle, "IPv6 lease deleted.");
+            StatsMgr::instance().addValue(
+                StatsMgr::generateName("subnet", lease6->subnet_id_,
+                                       lease6->type_ == Lease::TYPE_NA ?
+                                       "assigned-nas" : "assigned-pds"),
+                int64_t(-1));
         } else {
             setErrorResponse (handle, "IPv6 lease not found.", CONTROL_RESULT_EMPTY);
         }
@@ -1471,14 +1519,33 @@ LeaseCmdsImpl::lease6DelHandler(CalloutHandle& handle) {
 namespace { // anonymous namepace.
 
 bool addOrUpdate4(Lease4Ptr lease, bool force_create) {
-    if (force_create && !LeaseMgrFactory::instance().getLease4(lease->addr_)) {
+    Lease4Ptr lease4 = LeaseMgrFactory::instance().getLease4(lease->addr_);
+    if (force_create && !lease4) {
         if (!LeaseMgrFactory::instance().addLease(lease)) {
             isc_throw(db::DuplicateEntry,
                       "lost race between calls to get and add");
         }
+        StatsMgr::instance().addValue(
+            StatsMgr::generateName("subnet", lease->subnet_id_,
+                                   "assigned-addresses"),
+            int64_t(1));
         return (true);
     }
     LeaseMgrFactory::instance().updateLease4(lease);
+    bool update = lease4->checkUpdateStats();
+    if (lease4->subnet_id_ != lease->subnet_id_) {
+        StatsMgr::instance().addValue(
+            StatsMgr::generateName("subnet", lease4->subnet_id_,
+                                   "assigned-addresses"),
+            int64_t(-1));
+        update = true;
+    }
+    if (update) {
+        StatsMgr::instance().addValue(
+            StatsMgr::generateName("subnet", lease->subnet_id_,
+                                   "assigned-addresses"),
+            int64_t(1));
+    }
     return (false);
 }
 
@@ -1540,15 +1607,37 @@ LeaseCmdsImpl::lease4UpdateHandler(CalloutHandle& handle) {
 namespace { // anonymous namepace.
 
 bool addOrUpdate6(Lease6Ptr lease, bool force_create) {
-    if (force_create &&
-        !LeaseMgrFactory::instance().getLease6(lease->type_, lease->addr_)) {
+    Lease6Ptr lease6 =
+        LeaseMgrFactory::instance().getLease6(lease->type_, lease->addr_);
+    if (force_create && !lease6) {
         if (!LeaseMgrFactory::instance().addLease(lease)) {
             isc_throw(db::DuplicateEntry,
                       "lost race between calls to get and add");
         }
+        StatsMgr::instance().addValue(
+            StatsMgr::generateName("subnet", lease->subnet_id_,
+                                   lease->type_ == Lease::TYPE_NA ?
+                                   "assigned-nas" : "assigned-pds"),
+            int64_t(1));
         return (true);
     }
     LeaseMgrFactory::instance().updateLease6(lease);
+    bool update = lease6->checkUpdateStats();
+    if (lease6->subnet_id_ != lease->subnet_id_) {
+        StatsMgr::instance().addValue(
+            StatsMgr::generateName("subnet", lease6->subnet_id_,
+                                   lease->type_ == Lease::TYPE_NA ?
+                                   "assigned-nas" : "assigned-pds"),
+            int64_t(-1));
+        update = true;
+    }
+    if (update) {
+        StatsMgr::instance().addValue(
+            StatsMgr::generateName("subnet", lease->subnet_id_,
+                                   lease->type_ == Lease::TYPE_NA ?
+                                   "assigned-nas" : "assigned-pds"),
+            int64_t(1));
+    }
     return (false);
 }
 
@@ -1628,6 +1717,10 @@ LeaseCmdsImpl::lease4WipeHandler(CalloutHandle& handle) {
             // Wipe a single subnet
             num = LeaseMgrFactory::instance().wipeLeases4(id);
             ids << " " << id;
+            StatsMgr::instance().setValue(StatsMgr::generateName("subnet",
+                                                                 id,
+                                                                 "assigned-addresses"),
+                                          int64_t(0));
         } else {
             // Wipe them all!
             ConstSrvConfigPtr config = CfgMgr::instance().getCurrentCfg();
@@ -1638,6 +1731,10 @@ LeaseCmdsImpl::lease4WipeHandler(CalloutHandle& handle) {
             for (auto sub : *subs) {
                 num += LeaseMgrFactory::instance().wipeLeases4(sub->getID());
                 ids << " " << sub->getID();
+                StatsMgr::instance().setValue(StatsMgr::generateName("subnet",
+                                                                     sub->getID(),
+                                                                     "assigned-addresses"),
+                                              int64_t(0));
             }
         }
 
@@ -1680,6 +1777,12 @@ LeaseCmdsImpl::lease6WipeHandler(CalloutHandle& handle) {
             // Wipe a single subnet.
             num = LeaseMgrFactory::instance().wipeLeases6(id);
             ids << " " << id;
+            StatsMgr::instance().setValue(
+                StatsMgr::generateName("subnet", id, "assigned-nas" ),
+                int64_t(0));
+            StatsMgr::instance().setValue(
+                StatsMgr::generateName("subnet", id, "assigned-pds"),
+                int64_t(0));
        } else {
             // Wipe them all!
             ConstSrvConfigPtr config = CfgMgr::instance().getCurrentCfg();
@@ -1690,6 +1793,12 @@ LeaseCmdsImpl::lease6WipeHandler(CalloutHandle& handle) {
             for (auto sub : *subs) {
                 num += LeaseMgrFactory::instance().wipeLeases6(sub->getID());
                 ids << " " << sub->getID();
+                StatsMgr::instance().setValue(
+                    StatsMgr::generateName("subnet", sub->getID(), "assigned-nas" ),
+                    int64_t(0));
+                StatsMgr::instance().setValue(
+                    StatsMgr::generateName("subnet", sub->getID(), "assigned-pds"),
+                    int64_t(0));
             }
         }
 
index 251ed5bed71775d643cf65f542f181e0d3765dd9..999ef07a1c835725f420a1632e4c35e48c9ceb06 100644 (file)
 #include <dhcpsrv/cfgmgr.h>
 #include <cc/command_interpreter.h>
 #include <cc/data.h>
+#include <stats/stats_mgr.h>
 #include <testutils/user_context_utils.h>
+
 #include <gtest/gtest.h>
+
 #include <errno.h>
 #include <set>
 
@@ -28,6 +31,7 @@ using namespace isc::data;
 using namespace isc::dhcp;
 using namespace isc::dhcp_ddns;
 using namespace isc::asiolink;
+using namespace isc::stats;
 using namespace isc::test;
 
 namespace {
@@ -272,6 +276,7 @@ public:
         LeaseMgrFactory::destroy();
         enableD2();
         lmptr_ = 0;
+        StatsMgr::instance().removeAll();
     }
 
     /// @brief Destructor
@@ -284,6 +289,7 @@ public:
         disableD2();
         unloadLibs();
         lmptr_ = 0;
+        StatsMgr::instance().removeAll();
     }
 
     /// @brief Initializes lease manager (and optionally populates it with a lease)
@@ -295,7 +301,8 @@ public:
     ///
     /// @param v6 true = v6, false = v4
     /// @param insert_lease governs whether a lease should be pre-inserted
-    void initLeaseMgr(bool v6, bool insert_lease) {
+    /// @param expired governs whether a lease should be expired
+    void initLeaseMgr(bool v6, bool insert_lease, bool expired = false) {
 
         LeaseMgrFactory::destroy();
         std::ostringstream s;
@@ -324,15 +331,27 @@ public:
 
         if (insert_lease) {
             if (v6) {
-                lmptr_->addLease(createLease6("2001:db8:1::1", 66, 0x42));
-                lmptr_->addLease(createLease6("2001:db8:1::2", 66, 0x56));
-                lmptr_->addLease(createLease6("2001:db8:2::1", 99, 0x42));
-                lmptr_->addLease(createLease6("2001:db8:2::2", 99, 0x56));
+                lmptr_->addLease(createLease6("2001:db8:1::1", 66, 0x42, expired));
+                lmptr_->addLease(createLease6("2001:db8:1::2", 66, 0x56, expired));
+                lmptr_->addLease(createLease6("2001:db8:2::1", 99, 0x42, expired));
+                lmptr_->addLease(createLease6("2001:db8:2::2", 99, 0x56, expired));
+                StatsMgr::instance().setValue(
+                    StatsMgr::generateName("subnet", 66, "assigned-nas" ),
+                    int64_t(2));
+                StatsMgr::instance().setValue(
+                    StatsMgr::generateName("subnet", 99, "assigned-nas" ),
+                    int64_t(2));
             } else {
-                lmptr_->addLease(createLease4("192.0.2.1", 44, 0x08, 0x42));
-                lmptr_->addLease(createLease4("192.0.2.2", 44, 0x09, 0x56));
-                lmptr_->addLease(createLease4("192.0.3.1", 88, 0x08, 0x42));
-                lmptr_->addLease(createLease4("192.0.3.2", 88, 0x09, 0x56));
+                lmptr_->addLease(createLease4("192.0.2.1", 44, 0x08, 0x42, expired));
+                lmptr_->addLease(createLease4("192.0.2.2", 44, 0x09, 0x56, expired));
+                lmptr_->addLease(createLease4("192.0.3.1", 88, 0x08, 0x42, expired));
+                lmptr_->addLease(createLease4("192.0.3.2", 88, 0x09, 0x56, expired));
+                StatsMgr::instance().setValue(
+                    StatsMgr::generateName("subnet", 44, "assigned-addresses"),
+                    int64_t(2));
+                StatsMgr::instance().setValue(
+                    StatsMgr::generateName("subnet", 88, "assigned-addresses"),
+                    int64_t(2));
             }
         }
     }
@@ -348,10 +367,13 @@ public:
     /// it 6 times.
     /// @param client_id_pattern value to be used for generating client identifier by
     /// repeating it 8 times.
+    /// @param expired controls weather the lease should be expired.
     /// @return Returns the lease created
-    Lease4Ptr createLease4(const std::string& ip_address, const SubnetID& subnet_id,
+    Lease4Ptr createLease4(const std::string& ip_address,
+                           const SubnetID& subnet_id,
                            const uint8_t hw_address_pattern,
-                           const uint8_t client_id_pattern) {
+                           const uint8_t client_id_pattern,
+                           bool expired = false) {
         Lease4Ptr lease(new Lease4());
 
         lease->addr_ = IOAddress(ip_address);
@@ -361,8 +383,13 @@ public:
         lease->client_id_ = ClientIdPtr(new ClientId(vector<uint8_t>(8, client_id_pattern)));
         // Purposely using high cltt and valid lifetime to test that
         // expiration time is cast properly.
-        lease->valid_lft_ = HIGH_VALID_LIFETIME; // Very high valid lifetime
-        lease->cltt_ = DEC_2030_TIME; // December 11th 2030
+        if (expired) {
+            lease->cltt_ = 0;
+            lease->valid_lft_ = 60;
+        } else {
+            lease->cltt_ = DEC_2030_TIME; // December 11th 2030
+            lease->valid_lft_ = HIGH_VALID_LIFETIME; // Very high valid lifetime
+        }
         lease->subnet_id_ = subnet_id;
         lease->fqdn_fwd_ = false;
         lease->fqdn_rev_ = true;
@@ -381,9 +408,12 @@ public:
     /// @param subnet_id subnet identifier
     /// @param duid_address_pattern value to be used for generating DUID by
     /// repeating it 8 times
+    /// @param expired controls weather the lease should be expired.
     /// @return Returns the lease created
-    Lease6Ptr createLease6(const std::string& ip_address, const SubnetID& subnet_id,
-                           const uint8_t duid_pattern) {
+    Lease6Ptr createLease6(const std::string& ip_address,
+                           const SubnetID& subnet_id,
+                           const uint8_t duid_pattern,
+                           bool expired = false) {
         Lease6Ptr lease(new Lease6());
 
         lease->addr_ = IOAddress(ip_address);
@@ -394,8 +424,13 @@ public:
         lease->preferred_lft_ = 1800;
         // Purposely using high cltt and valid lifetime to test that
         // expiration time is cast properly.
-        lease->valid_lft_ = HIGH_VALID_LIFETIME; // Very high valid lifetime
-        lease->cltt_ = DEC_2030_TIME; // December 11th 2030
+        if (expired) {
+            lease->cltt_ = 0;
+            lease->valid_lft_ = 60;
+        } else {
+            lease->cltt_ = DEC_2030_TIME; // December 11th 2030
+            lease->valid_lft_ = HIGH_VALID_LIFETIME; // Very high valid lifetime
+        }
         lease->subnet_id_ = subnet_id;
         lease->fqdn_fwd_ = false;
         lease->fqdn_rev_ = true;
@@ -813,6 +848,12 @@ TEST_F(LeaseCmdsTest, Lease4Add) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -826,6 +867,12 @@ TEST_F(LeaseCmdsTest, Lease4Add) {
     string exp_rsp = "Lease for address 192.0.2.202, subnet-id 44 added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.202"));
     ASSERT_TRUE(l);
@@ -844,7 +891,6 @@ TEST_F(LeaseCmdsTest, Lease4Add) {
     // by one is ok.
     EXPECT_LE(abs(l->cltt_ - time(NULL)), 1);
     EXPECT_EQ(0, l->state_);
-
 }
 
 // Check that a lease4 is not added when it already exists.
@@ -856,6 +902,12 @@ TEST_F(LeaseCmdsTest, Lease4AddExisting) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -868,6 +920,12 @@ TEST_F(LeaseCmdsTest, Lease4AddExisting) {
         "}";
     string exp_rsp = "IPv4 lease already exists.";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
 }
 
 // Check that subnet-id is optional. If not specified, Kea should select
@@ -880,6 +938,12 @@ TEST_F(LeaseCmdsTest, Lease4AddSubnetIdMissing) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now send the command without subnet-id. Kea should select
     // the subnet id on its own.
     string txt =
@@ -893,6 +957,12 @@ TEST_F(LeaseCmdsTest, Lease4AddSubnetIdMissing) {
     string exp_rsp = "Lease for address 192.0.2.202, subnet-id 44 added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.202"));
     ASSERT_TRUE(l);
@@ -911,6 +981,12 @@ TEST_F(LeaseCmdsTest, Lease4AddSubnetIdMissingBadAddr) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now send the command without subnet-id. Kea should select
     // the subnet id on its own.
     string txt =
@@ -925,6 +1001,12 @@ TEST_F(LeaseCmdsTest, Lease4AddSubnetIdMissingBadAddr) {
                      "address 192.0.55.1";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now check that the lease was not added.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.55.1"));
     ASSERT_FALSE(l);
@@ -939,6 +1021,12 @@ TEST_F(LeaseCmdsTest, Lease4AddNegativeExpireTime) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Add a lease with negative expiration time.
     string txt =
         "{\n"
@@ -952,6 +1040,12 @@ TEST_F(LeaseCmdsTest, Lease4AddNegativeExpireTime) {
     string exp_rsp = "expiration time must be positive for address 192.0.2.202";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now check that the lease was not added.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.202"));
     ASSERT_FALSE(l);
@@ -966,6 +1060,12 @@ TEST_F(LeaseCmdsTest, Lease4AddNegativeCltt) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Add a lease with negative cltt (expiration time - valid lifetime)
     string txt =
         "{\n"
@@ -981,6 +1081,12 @@ TEST_F(LeaseCmdsTest, Lease4AddNegativeCltt) {
         "address 192.0.2.202";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now check that the lease was not added.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.202"));
     ASSERT_FALSE(l);
@@ -995,6 +1101,12 @@ TEST_F(LeaseCmdsTest, Lease4AddFull) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -1015,6 +1127,12 @@ TEST_F(LeaseCmdsTest, Lease4AddFull) {
     string exp_rsp = "Lease for address 192.0.2.202, subnet-id 44 added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.202"));
     ASSERT_TRUE(l);
@@ -1041,6 +1159,12 @@ TEST_F(LeaseCmdsTest, Lease4AddComment) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -1055,6 +1179,12 @@ TEST_F(LeaseCmdsTest, Lease4AddComment) {
     string exp_rsp = "Lease for address 192.0.2.202, subnet-id 44 added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.202"));
     ASSERT_TRUE(l);
@@ -1309,6 +1439,18 @@ TEST_F(LeaseCmdsTest, Lease6Add) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -1323,6 +1465,18 @@ TEST_F(LeaseCmdsTest, Lease6Add) {
     string exp_rsp = "Lease for address 2001:db8:1::3, subnet-id 66 added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::3"));
     ASSERT_TRUE(l);
@@ -1339,6 +1493,18 @@ TEST_F(LeaseCmdsTest, Lease6AddExisting) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -1352,6 +1518,18 @@ TEST_F(LeaseCmdsTest, Lease6AddExisting) {
         "}";
     string exp_rsp = "IPv6 lease already exists.";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
 }
 
 // Check that subnet-id is optional. If not specified, Kea should select
@@ -1364,6 +1542,18 @@ TEST_F(LeaseCmdsTest, Lease6AddSubnetIdMissing) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command (without subnet-id)
     string txt =
         "{\n"
@@ -1377,6 +1567,18 @@ TEST_F(LeaseCmdsTest, Lease6AddSubnetIdMissing) {
     string exp_rsp = "Lease for address 2001:db8:1::3, subnet-id 66 added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now check that the lease is really there and has correct subnet-id.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::3"));
     ASSERT_TRUE(l);
@@ -1394,6 +1596,18 @@ TEST_F(LeaseCmdsTest, Lease6AddSubnetIdMissingBadAddr) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command (without subnet-id)
     string txt =
         "{\n"
@@ -1408,7 +1622,19 @@ TEST_F(LeaseCmdsTest, Lease6AddSubnetIdMissingBadAddr) {
                      "address 2001:ffff::1";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
 
-    // Now check that the lease is really there and has correct subnet-id.
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
+    // Now check that the lease was not added.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:ffff::1"));
     ASSERT_FALSE(l);
 }
@@ -1422,6 +1648,18 @@ TEST_F(LeaseCmdsTest, Lease6AddPrefix) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -1438,6 +1676,18 @@ TEST_F(LeaseCmdsTest, Lease6AddPrefix) {
     string exp_rsp = "Lease for prefix 2001:db8:abcd::/48, subnet-id 66 added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_PD, IOAddress("2001:db8:abcd::"));
     ASSERT_TRUE(l);
@@ -1456,6 +1706,18 @@ TEST_F(LeaseCmdsTest, Lease6AddFullAddr) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -1478,6 +1740,18 @@ TEST_F(LeaseCmdsTest, Lease6AddFullAddr) {
     string exp_rsp = "Lease for address 2001:db8:1::3, subnet-id 66 added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::3"));
     ASSERT_TRUE(l);
@@ -1505,6 +1779,18 @@ TEST_F(LeaseCmdsTest, Lease6AddComment) {
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -1520,6 +1806,18 @@ TEST_F(LeaseCmdsTest, Lease6AddComment) {
     string exp_rsp = "Lease for address 2001:db8:1::3, subnet-id 66 added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::3"));
     ASSERT_TRUE(l);
@@ -1609,9 +1907,12 @@ TEST_F(LeaseCmdsTest, Lease4GetMissingParams) {
 // Checks that lease4-get sanitizes its input.
 TEST_F(LeaseCmdsTest, Lease4GetByAddrBadParam) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Invalid family
     string cmd =
         "{\n"
@@ -1639,9 +1940,12 @@ TEST_F(LeaseCmdsTest, Lease4GetByAddrBadParam) {
 // valid, but the lease is not there.
 TEST_F(LeaseCmdsTest, Lease4GetByAddrNotFound) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Invalid
     string cmd =
         "{\n"
@@ -1658,9 +1962,12 @@ TEST_F(LeaseCmdsTest, Lease4GetByAddrNotFound) {
 // Checks that lease4-get can return a lease by address.
 TEST_F(LeaseCmdsTest, Lease4GetByAddr) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for valid, existing lease.
     string cmd =
         "{\n"
@@ -1685,9 +1992,12 @@ TEST_F(LeaseCmdsTest, Lease4GetByAddr) {
 // well formed, but the lease is not there.
 TEST_F(LeaseCmdsTest, Lease4GetByHWAddrNotFound) {
 
-    // Initialize lease manager (false = v4, false = don't add a lease)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // No such lease.
     string cmd =
         "{\n"
@@ -1705,9 +2015,12 @@ TEST_F(LeaseCmdsTest, Lease4GetByHWAddrNotFound) {
 // Checks that lease4-get can find a lease by hardware address.
 TEST_F(LeaseCmdsTest, Lease4GetByHWAddr) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Invalid
     string cmd =
         "{\n"
@@ -1734,9 +2047,12 @@ TEST_F(LeaseCmdsTest, Lease4GetByHWAddr) {
 // the query is correctly formed, but the lease is not there.
 TEST_F(LeaseCmdsTest, Lease6GetByAddr6NotFound) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -1757,9 +2073,12 @@ TEST_F(LeaseCmdsTest, Lease6GetByAddr6NotFound) {
 // well formed, but the lease is not there.
 TEST_F(LeaseCmdsTest, Lease4GetByClientIdNotFound) {
 
-    // Initialize lease manager (false = v4, false = don't add a lease)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // No such lease.
     string cmd =
         "{\n"
@@ -1776,9 +2095,12 @@ TEST_F(LeaseCmdsTest, Lease4GetByClientIdNotFound) {
 
 // Check that lease4-get can find a lease by client identifier.
 TEST_F(LeaseCmdsTest, Lease4GetByClientId) {
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     string cmd =
         "{\n"
         "    \"command\": \"lease4-get\",\n"
@@ -1803,9 +2125,12 @@ TEST_F(LeaseCmdsTest, Lease4GetByClientId) {
 // Checks that lease6-get rejects queries by client-id.
 TEST_F(LeaseCmdsTest, Lease6GetByClientIdInvalidType) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // client-id query is allowed in v4 only.
     string cmd =
         "{\n"
@@ -1823,9 +2148,12 @@ TEST_F(LeaseCmdsTest, Lease6GetByClientIdInvalidType) {
 // Checks that lease6-get(subnet-id, addr) can handle a situation when
 // the query is correctly formed, but the lease is not there.
 TEST_F(LeaseCmdsTest, Lease6GetByDuidNotFound) {
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -1849,6 +2177,9 @@ TEST_F(LeaseCmdsTest, Lease6GetByAddr) {
 
     initLeaseMgr(true, true); // (true = v6, true = create a lease)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -1873,9 +2204,12 @@ TEST_F(LeaseCmdsTest, Lease6GetByAddr) {
 // Checks that lease6-get sanitizes its input.
 TEST_F(LeaseCmdsTest, Lease6GetByAddrBadParam) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Invalid family
     string cmd =
         "{\n"
@@ -1906,6 +2240,9 @@ TEST_F(LeaseCmdsTest, Lease6GetByAddrPrefix) {
     // We need to get a prefix lease. We need to create it by hand.
     initLeaseMgr(true, false); // (true = v6, true = create a lease)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Let's start with regular address lease and make it a prefix lease.
     Lease6Ptr l = createLease6("2001:db8:1::1", 66, 0x77);
     l->addr_ = IOAddress("2001:db8:1234:ab::");
@@ -1941,6 +2278,9 @@ TEST_F(LeaseCmdsTest, Lease6GetByDUID) {
 
     initLeaseMgr(true, true); // (true = v6, true = create a lease)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -1968,9 +2308,12 @@ TEST_F(LeaseCmdsTest, Lease6GetByDUID) {
 // Checks that lease4-get-all returns all leases.
 TEST_F(LeaseCmdsTest, Lease4GetAll) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for all leases.
     string cmd =
         "{\n"
@@ -2003,6 +2346,9 @@ TEST_F(LeaseCmdsTest, Lease4GetAllNoLeases) {
     // Initialize lease manager (false = v4, false = do not add leasesxs)
     initLeaseMgr(false, false);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for all leases.
     string cmd =
         "{\n"
@@ -2025,13 +2371,15 @@ TEST_F(LeaseCmdsTest, Lease4GetAllNoLeases) {
     EXPECT_EQ(0, leases->size());
 }
 
-
 // Checks that lease4-get-all returns all leases for a subnet.
 TEST_F(LeaseCmdsTest, Lease4GetAllBySubnetId) {
 
     // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for leases from subnet 44. Subnet 127 will be ignored because
     // it doesn't contain any leases.
     string cmd =
@@ -2063,9 +2411,12 @@ TEST_F(LeaseCmdsTest, Lease4GetAllBySubnetId) {
 // Checks that lease4-get-all returns empty set when no leases are found.
 TEST_F(LeaseCmdsTest, Lease4GetAllBySubnetIdNoLeases) {
 
-    // Initialize lease manager (false = v4, true = do not add leases)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for leases from subnet 44. Subnet 127 will be ignored because
     // it doesn't contain any leases.
     string cmd =
@@ -2095,9 +2446,12 @@ TEST_F(LeaseCmdsTest, Lease4GetAllBySubnetIdNoLeases) {
 // Checks that lease4-get-all returns leases from multiple subnets.
 TEST_F(LeaseCmdsTest, Lease4GetAllByMultipleSubnetIds) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for leases from subnet 44 and 88.
     string cmd =
         "{\n"
@@ -2130,9 +2484,12 @@ TEST_F(LeaseCmdsTest, Lease4GetAllByMultipleSubnetIds) {
 // Checks that lease4-get-all checks its input arguments.
 TEST_F(LeaseCmdsTest, Lease4GetBySubnetIdInvalidArguments) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Subnets not specified in arguments.
     string cmd =
         "{\n"
@@ -2170,9 +2527,12 @@ TEST_F(LeaseCmdsTest, Lease4GetBySubnetIdInvalidArguments) {
 // Checks that multiple calls to lease4-get-pages return all leases.
 TEST_F(LeaseCmdsTest, Lease4GetPaged) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Gather all returned addresses to verify that all were returned.
     std::set<std::string> lease_addresses;
 
@@ -2263,9 +2623,12 @@ TEST_F(LeaseCmdsTest, Lease4GetPaged) {
 // zero IPv4 address.
 TEST_F(LeaseCmdsTest, Lease4GetPagedZeroAddress) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for a page of leases.
     string cmd =
         "{\n"
@@ -2283,9 +2646,12 @@ TEST_F(LeaseCmdsTest, Lease4GetPagedZeroAddress) {
 // Verifies that IPv6 address as a start address is rejected.
 TEST_F(LeaseCmdsTest, Lease4GetPagedIPv4Address) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for a page of leases.
     string cmd =
         "{\n"
@@ -2303,9 +2669,12 @@ TEST_F(LeaseCmdsTest, Lease4GetPagedIPv4Address) {
 // Checks that lease6-get-all returns all leases.
 TEST_F(LeaseCmdsTest, Lease6GetAll) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for all leases.
     string cmd =
         "{\n"
@@ -2338,6 +2707,9 @@ TEST_F(LeaseCmdsTest, Lease6GetAllNoLeases) {
     // Initialize lease manager (true = v6, false = do not add leasesxs)
     initLeaseMgr(true, false);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for all leases.
     string cmd =
         "{\n"
@@ -2360,13 +2732,15 @@ TEST_F(LeaseCmdsTest, Lease6GetAllNoLeases) {
     EXPECT_EQ(0, leases->size());
 }
 
-
 // Checks that lease6-get-all returns all leases for a subnet.
 TEST_F(LeaseCmdsTest, Lease6GetAllBySubnetId) {
 
     // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for leases from subnet 66. Subnet 127 will be ignored because
     // it doesn't contain any leases.
     string cmd =
@@ -2398,9 +2772,12 @@ TEST_F(LeaseCmdsTest, Lease6GetAllBySubnetId) {
 // Checks that lease6-get-all returns empty set when no leases are found.
 TEST_F(LeaseCmdsTest, Lease6GetAllBySubnetIdNoLeases) {
 
-    // Initialize lease manager (true = v6, true = do not add leases)
+    // Initialize lease manager (true = v6, false = don't add leases)
     initLeaseMgr(true, false);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for leases from subnet 66. Subnet 127 will be ignored because
     // it doesn't contain any leases.
     string cmd =
@@ -2430,9 +2807,12 @@ TEST_F(LeaseCmdsTest, Lease6GetAllBySubnetIdNoLeases) {
 // Checks that lease6-get-all returns leases from multiple subnets.
 TEST_F(LeaseCmdsTest, Lease6GetAllByMultipleSubnetIds) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for leases from subnet 66 and 99.
     string cmd =
         "{\n"
@@ -2465,9 +2845,12 @@ TEST_F(LeaseCmdsTest, Lease6GetAllByMultipleSubnetIds) {
 // Checks that lease6-get-all checks its input arguments.
 TEST_F(LeaseCmdsTest, Lease6GetBySubnetIdInvalidArguments) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Subnets not specified in arguments.
     string cmd =
         "{\n"
@@ -2505,9 +2888,12 @@ TEST_F(LeaseCmdsTest, Lease6GetBySubnetIdInvalidArguments) {
 // Checks that multiple calls to lease6-get-page return all leases.
 TEST_F(LeaseCmdsTest, Lease6GetPaged) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Gather all returned addresses to verify that all were returned.
     std::set<std::string> lease_addresses;
 
@@ -2599,9 +2985,12 @@ TEST_F(LeaseCmdsTest, Lease6GetPaged) {
 // zero IPv6 address.
 TEST_F(LeaseCmdsTest, Lease6GetPagedZeroAddress) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for a page of leases.
     string cmd =
         "{\n"
@@ -2619,9 +3008,12 @@ TEST_F(LeaseCmdsTest, Lease6GetPagedZeroAddress) {
 // Verifies that IPv4 address as a start address is rejected.
 TEST_F(LeaseCmdsTest, Lease6GetPagedIPv4Address) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for a page of leases.
     string cmd =
         "{\n"
@@ -2640,9 +3032,12 @@ TEST_F(LeaseCmdsTest, Lease6GetPagedIPv4Address) {
 // address is rejected.
 TEST_F(LeaseCmdsTest, Lease6GetPagedInvalidFrom) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for a page of leases.
     string cmd =
         "{\n"
@@ -2661,9 +3056,12 @@ TEST_F(LeaseCmdsTest, Lease6GetPagedInvalidFrom) {
 // Verifies that limit is mandatory.
 TEST_F(LeaseCmdsTest, Lease6GetPagedNoLimit) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for a page of leases.
     string cmd =
         "{\n"
@@ -2680,9 +3078,12 @@ TEST_F(LeaseCmdsTest, Lease6GetPagedNoLimit) {
 // Verifies that the limit must be a number.
 TEST_F(LeaseCmdsTest, Lease6GetPagedLimitNotNumber) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for a page of leases.
     string cmd =
         "{\n"
@@ -2700,9 +3101,12 @@ TEST_F(LeaseCmdsTest, Lease6GetPagedLimitNotNumber) {
 // Verifies that the limit of 0 is rejected.
 TEST_F(LeaseCmdsTest, Lease6GetPagedLimitIsZero) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Query for a page of leases.
     string cmd =
         "{\n"
@@ -2757,10 +3161,13 @@ TEST_F(LeaseCmdsTest, LeaseGetByHwAddressParams) {
 
 // Checks that lease4-get-by-hw-address works as expected (find no lease).
 TEST_F(LeaseCmdsTest, LeaseGetByHwAddressFind0) {
-    // Initialize lease manager (false = v4, false = don't add a lease)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
-    // No such leasea.
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    // No such lease.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-get-by-hw-address\",\n"
@@ -2777,6 +3184,9 @@ TEST_F(LeaseCmdsTest, LeaseGetByHwAddressFind2) {
     // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Get the lease.
     string cmd =
         "{\n"
@@ -2847,10 +3257,13 @@ TEST_F(LeaseCmdsTest, LeaseGetByClientIdParams) {
 
 // Checks that lease4-get-by-client-id works as expected (find no lease).
 TEST_F(LeaseCmdsTest, LeaseGetByClientIdFind0) {
-    // Initialize lease manager (false = v4, false = don't add a lease)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
-    // No such leasea.
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    // No such lease.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-get-by-client-id\",\n"
@@ -2867,6 +3280,9 @@ TEST_F(LeaseCmdsTest, LeaseGetByClientIdFind2) {
     // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Get the lease.
     string cmd =
         "{\n"
@@ -2937,13 +3353,16 @@ TEST_F(LeaseCmdsTest, LeaseGetByDuidParams) {
 
 // Checks that lease6-get-by-duid works as expected (find no lease).
 TEST_F(LeaseCmdsTest, LeaseGetByDuidFind0) {
-    // Initialize lease manager (true = v6, false = don't add a lease)
+    // Initialize lease manager (true = v6, false = don't add leases)
     initLeaseMgr(true, false);
 
-    // No such leasea.
-    string cmd =
-        "{\n"
-        "    \"command\": \"lease6-get-by-duid\",\n"
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    // No such lease.
+    string cmd =
+        "{\n"
+        "    \"command\": \"lease6-get-by-duid\",\n"
         "    \"arguments\": {"
         "        \"duid\": \"00:01:02:03:04:05:06:07\"\n"
         "    }\n"
@@ -2957,6 +3376,9 @@ TEST_F(LeaseCmdsTest, LeaseGetByDuidFind2) {
     // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Get the lease.
     string cmd =
         "{\n"
@@ -3026,10 +3448,13 @@ TEST_F(LeaseCmdsTest, Lease4GetByHostnameParams) {
 
 // Checks that lease4-get-by-hostname works as expected (find no lease).
 TEST_F(LeaseCmdsTest, Lease4GetByHostnameFind0) {
-    // Initialize lease manager (false = v4, false = don't add a lease)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
-    // No such leasea.
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    // No such lease.
     string cmd =
         "{\n"
         "    \"command\": \"lease4-get-by-hostname\",\n"
@@ -3046,6 +3471,9 @@ TEST_F(LeaseCmdsTest, Lease4GetByHostnameFind2) {
     // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Get the lease.
     string cmd =
         "{\n"
@@ -3115,10 +3543,13 @@ TEST_F(LeaseCmdsTest, Lease6GetByHostnameParams) {
 
 // Checks that lease6-get-by-hostname works as expected (find no lease).
 TEST_F(LeaseCmdsTest, Lease6GetByHostnameFind0) {
-    // Initialize lease manager (true = v6, false = don't add a lease)
+    // Initialize lease manager (true = v6, false = don't add leases)
     initLeaseMgr(true, false);
 
-    // No such leasea.
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    // No such lease.
     string cmd =
         "{\n"
         "    \"command\": \"lease6-get-by-hostname\",\n"
@@ -3135,6 +3566,9 @@ TEST_F(LeaseCmdsTest, Lease6GetByHostnameFind2) {
     // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Get the lease.
     string cmd =
         "{\n"
@@ -3167,7 +3601,7 @@ TEST_F(LeaseCmdsTest, Lease6GetByHostnameFind2) {
 
 // Test checks if lease4-update handler refuses calls with missing parameters.
 TEST_F(LeaseCmdsTest, Lease4UpdateMissingParams) {
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
     // Check that the lease manager pointer is there.
@@ -3224,7 +3658,7 @@ TEST_F(LeaseCmdsTest, Lease4UpdateMissingParams) {
 // have incorrect values.
 TEST_F(LeaseCmdsTest, Lease4UpdateBadParams) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
     // Check that the lease manager pointer is there.
@@ -3305,7 +3739,7 @@ TEST_F(LeaseCmdsTest, Lease4UpdateBadParams) {
 // no lease to be updated.
 TEST_F(LeaseCmdsTest, Lease4UpdateNoLease) {
 
-    // Initialize lease manager (false = v4, false = don't add any lease)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
     // Check that the lease manager pointer is there.
@@ -3330,12 +3764,18 @@ TEST_F(LeaseCmdsTest, Lease4UpdateNoLease) {
 // and a hostname.
 TEST_F(LeaseCmdsTest, Lease4Update) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3350,6 +3790,59 @@ TEST_F(LeaseCmdsTest, Lease4Update) {
     string exp_rsp = "IPv4 lease updated.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
+    // Now check that the lease is still there.
+    Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
+    ASSERT_TRUE(l);
+
+    // Make sure it's been updated.
+    ASSERT_TRUE(l->hwaddr_);
+    EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->hwaddr_->toText(false));
+    EXPECT_EQ("newhostname.example.org", l->hostname_);
+    EXPECT_FALSE(l->getContext());
+}
+
+// Check that a lease4 can be updated. We're changing hw-address
+// and a hostname.
+TEST_F(LeaseCmdsTest, Lease4UpdateWithStats) {
+
+    // Initialize lease manager (false = v4, true = add leases)
+    initLeaseMgr(false, true, true);
+
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
+    // Now send the command.
+    string txt =
+        "{\n"
+        "    \"command\": \"lease4-update\",\n"
+        "    \"arguments\": {"
+        "        \"subnet-id\": 44,\n"
+        "        \"ip-address\": \"192.0.2.1\",\n"
+        "        \"hw-address\": \"1a:1b:1c:1d:1e:1f\",\n"
+        "        \"hostname\": \"newhostname.example.org\""
+        "    }\n"
+        "}";
+    string exp_rsp = "IPv4 lease updated.";
+    testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 3);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Now check that the lease is still there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
@@ -3365,12 +3858,18 @@ TEST_F(LeaseCmdsTest, Lease4Update) {
 // and a hostname. The subnet-id is not specified.
 TEST_F(LeaseCmdsTest, Lease4UpdateNoSubnetId) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3384,6 +3883,58 @@ TEST_F(LeaseCmdsTest, Lease4UpdateNoSubnetId) {
     string exp_rsp = "IPv4 lease updated.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
+    // Now check that the lease is still there.
+    Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
+    ASSERT_TRUE(l);
+
+    // Make sure it's been updated.
+    ASSERT_TRUE(l->hwaddr_);
+    EXPECT_EQ("1a:1b:1c:1d:1e:1f", l->hwaddr_->toText(false));
+    EXPECT_EQ("newhostname.example.org", l->hostname_);
+    EXPECT_FALSE(l->getContext());
+}
+
+// Check that a lease4 can be updated. We're changing hw-address
+// and a hostname. The subnet-id is not specified.
+TEST_F(LeaseCmdsTest, Lease4UpdateNoSubnetIdWithStats) {
+
+    // Initialize lease manager (false = v4, true = add leases)
+    initLeaseMgr(false, true, true);
+
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
+    // Now send the command.
+    string txt =
+        "{\n"
+        "    \"command\": \"lease4-update\",\n"
+        "    \"arguments\": {"
+        "        \"ip-address\": \"192.0.2.1\",\n"
+        "        \"hw-address\": \"1a:1b:1c:1d:1e:1f\",\n"
+        "        \"hostname\": \"newhostname.example.org\""
+        "    }\n"
+        "}";
+    string exp_rsp = "IPv4 lease updated.";
+    testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 3);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Now check that the lease is still there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
@@ -3399,12 +3950,18 @@ TEST_F(LeaseCmdsTest, Lease4UpdateNoSubnetId) {
 // To trigger this behavior 'force-create' boolean parameter must be
 // included in the command.
 TEST_F(LeaseCmdsTest, Lease4UpdateForceCreate) {
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, false);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3420,6 +3977,12 @@ TEST_F(LeaseCmdsTest, Lease4UpdateForceCreate) {
     string exp_rsp = "IPv4 lease added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now check that the lease is still there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
@@ -3436,12 +3999,18 @@ TEST_F(LeaseCmdsTest, Lease4UpdateForceCreate) {
 // included in the command. The subnet-id is not specified, Kea will
 // figure it out.
 TEST_F(LeaseCmdsTest, Lease4UpdateForceCreateNoSubnetId) {
-    // Initialize lease manager (false = v4, false = don't add any lease)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3456,6 +4025,12 @@ TEST_F(LeaseCmdsTest, Lease4UpdateForceCreateNoSubnetId) {
     string exp_rsp = "IPv4 lease added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now check that the lease is still there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
@@ -3474,12 +4049,18 @@ TEST_F(LeaseCmdsTest, Lease4UpdateForceCreateNoSubnetId) {
 // parameter is explicitly set to false.
 TEST_F(LeaseCmdsTest, Lease4UpdateDoNotForceCreate) {
 
-    // Initialize lease manager (false = v4, false = don't add any lease)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3494,18 +4075,30 @@ TEST_F(LeaseCmdsTest, Lease4UpdateDoNotForceCreate) {
         "}";
     string exp_rsp = "failed to update the lease with address 192.0.2.1 - no such lease";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
 }
 
 // Check that a lease4 can be updated. We're adding a comment and an user
 // context.
 TEST_F(LeaseCmdsTest, Lease4UpdateComment) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3521,6 +4114,12 @@ TEST_F(LeaseCmdsTest, Lease4UpdateComment) {
     string exp_rsp = "IPv4 lease updated.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Now check that the lease is still there.
     Lease4Ptr l = lmptr_->getLease4(IOAddress("192.0.2.1"));
     ASSERT_TRUE(l);
@@ -3541,7 +4140,7 @@ TEST_F(LeaseCmdsTest, Lease4UpdateComment) {
 
 // Test checks if lease6-update handler refuses calls with missing parameters.
 TEST_F(LeaseCmdsTest, Lease6UpdateMissingParams) {
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
     // Check that the lease manager pointer is there.
@@ -3598,7 +4197,7 @@ TEST_F(LeaseCmdsTest, Lease6UpdateMissingParams) {
 // have incorrect values.
 TEST_F(LeaseCmdsTest, Lease6UpdateBadParams) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
     // Check that the lease manager pointer is there.
@@ -3698,12 +4297,85 @@ TEST_F(LeaseCmdsTest, Lease6UpdateBadParams) {
 // and a hostname.
 TEST_F(LeaseCmdsTest, Lease6Update) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
+    // Now send the command.
+    string txt =
+        "{\n"
+        "    \"command\": \"lease6-update\",\n"
+        "    \"arguments\": {"
+        "        \"subnet-id\": 66,\n"
+        "        \"ip-address\": \"2001:db8:1::1\",\n"
+        "        \"iaid\": 7654321,\n"
+        "        \"duid\": \"88:88:88:88:88:88:88:88\",\n"
+        "        \"hostname\": \"newhostname.example.org\""
+        "    }\n"
+        "}";
+    string exp_rsp = "IPv6 lease updated.";
+    testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
+    // Now check that the lease is really there.
+    Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
+    ASSERT_TRUE(l);
+
+    // Make sure the lease has been updated.
+    ASSERT_TRUE(l->duid_);
+    EXPECT_EQ("88:88:88:88:88:88:88:88", l->duid_->toText());
+    EXPECT_EQ("newhostname.example.org", l->hostname_);
+    EXPECT_EQ(7654321, l->iaid_);
+    EXPECT_FALSE(l->getContext());
+}
+
+// Check that a lease6 can be updated. We're changing hw-address
+// and a hostname.
+TEST_F(LeaseCmdsTest, Lease6UpdateWithStats) {
+
+    // Initialize lease manager (true = v6, true = add leases)
+    initLeaseMgr(true, true, true);
+
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3719,6 +4391,18 @@ TEST_F(LeaseCmdsTest, Lease6Update) {
     string exp_rsp = "IPv6 lease updated.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 3);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
     ASSERT_TRUE(l);
@@ -3735,12 +4419,24 @@ TEST_F(LeaseCmdsTest, Lease6Update) {
 // and a hostname. The subnet-id is not specified.
 TEST_F(LeaseCmdsTest, Lease6UpdateNoSubnetId) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3755,6 +4451,18 @@ TEST_F(LeaseCmdsTest, Lease6UpdateNoSubnetId) {
     string exp_rsp = "IPv6 lease updated.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
     ASSERT_TRUE(l);
@@ -3770,17 +4478,91 @@ TEST_F(LeaseCmdsTest, Lease6UpdateNoSubnetId) {
     EXPECT_FALSE(l->getContext());
 }
 
+// Check that a lease6 can be updated. We're changing hw-address
+// and a hostname. The subnet-id is not specified.
+TEST_F(LeaseCmdsTest, Lease6UpdateNoSubnetIdWithStats) {
+
+    // Initialize lease manager (true = v6, true = add leases)
+    initLeaseMgr(true, true, true);
+
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
+    // Now send the command.
+    string txt =
+        "{\n"
+        "    \"command\": \"lease6-update\",\n"
+        "    \"arguments\": {"
+        "        \"ip-address\": \"2001:db8:1::1\",\n"
+        "        \"iaid\": 7654321,\n"
+        "        \"duid\": \"88:88:88:88:88:88:88:88\",\n"
+        "        \"hostname\": \"newhostname.example.org\""
+        "    }\n"
+        "}";
+    string exp_rsp = "IPv6 lease updated.";
+    testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 3);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
+    // Now check that the lease is really there.
+    Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
+    ASSERT_TRUE(l);
+
+    // Make sure the subnet-id is correct.
+    EXPECT_EQ(66, l->subnet_id_);
+
+    // Make sure the lease has been updated.
+    ASSERT_TRUE(l->duid_);
+    EXPECT_EQ("88:88:88:88:88:88:88:88", l->duid_->toText());
+    EXPECT_EQ("newhostname.example.org", l->hostname_);
+    EXPECT_EQ(7654321, l->iaid_);
+    EXPECT_FALSE(l->getContext());
+}
 
 // Check that a lease6 can be updated. We're adding a comment and an user
 // context.
 TEST_F(LeaseCmdsTest, Lease6UpdateComment) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3797,6 +4579,18 @@ TEST_F(LeaseCmdsTest, Lease6UpdateComment) {
     string exp_rsp = "IPv6 lease updated.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
     ASSERT_TRUE(l);
@@ -3814,17 +4608,28 @@ TEST_F(LeaseCmdsTest, Lease6UpdateComment) {
     EXPECT_EQ("true", ctx->get("foobar")->str());
 }
 
-
 // Check that lease6-update correctly handles case when there is
 // no lease to be updated.
 TEST_F(LeaseCmdsTest, Lease6UpdateNoLease) {
 
-    // Initialize lease manager (true = v6, false = don't add any lease)
+    // Initialize lease manager (true = v6, false = don't add leases)
     initLeaseMgr(true, false);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3839,6 +4644,18 @@ TEST_F(LeaseCmdsTest, Lease6UpdateNoLease) {
         "}";
     string exp_rsp = "failed to update the lease with address 2001:db8:1::1 - no such lease";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
 }
 
 // Check that a lease6 is created if it doesn't exist during the update.
@@ -3846,12 +4663,24 @@ TEST_F(LeaseCmdsTest, Lease6UpdateNoLease) {
 // included in the command.
 TEST_F(LeaseCmdsTest, Lease6UpdateForceCreate) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, false);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3868,6 +4697,18 @@ TEST_F(LeaseCmdsTest, Lease6UpdateForceCreate) {
     string exp_rsp = "IPv6 lease added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
     ASSERT_TRUE(l);
@@ -3886,12 +4727,24 @@ TEST_F(LeaseCmdsTest, Lease6UpdateForceCreate) {
 // figure it out.
 TEST_F(LeaseCmdsTest, Lease6UpdateForceCreateNoSubnetId) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, false);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3907,6 +4760,18 @@ TEST_F(LeaseCmdsTest, Lease6UpdateForceCreateNoSubnetId) {
     string exp_rsp = "IPv6 lease added.";
     testCommand(txt, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now check that the lease is really there.
     Lease6Ptr l = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
     ASSERT_TRUE(l);
@@ -3926,12 +4791,24 @@ TEST_F(LeaseCmdsTest, Lease6UpdateForceCreateNoSubnetId) {
 // parameter is explicitly set to false.
 TEST_F(LeaseCmdsTest, Lease6UpdateDoNotForceCreate) {
 
-    // Initialize lease manager (true = v6, false = don't add any lease)
+    // Initialize lease manager (true = v6, false = don't add leases)
     initLeaseMgr(true, false);
 
     // Check that the lease manager pointer is there.
     ASSERT_TRUE(lmptr_);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string txt =
         "{\n"
@@ -3947,6 +4824,18 @@ TEST_F(LeaseCmdsTest, Lease6UpdateDoNotForceCreate) {
         "}";
     string exp_rsp = "failed to update the lease with address 2001:db8:1::1 - no such lease";
     testCommand(txt, CONTROL_RESULT_ERROR, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
 }
 
 // Checks that lease6-del can handle a situation when the query is
@@ -4030,9 +4919,18 @@ TEST_F(LeaseCmdsTest, Lease4DelMissingParams) {
 // valid, but the lease is not there.
 TEST_F(LeaseCmdsTest, Lease4DelByAddrNotFound) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Invalid
     string cmd =
         "{\n"
@@ -4044,14 +4942,29 @@ TEST_F(LeaseCmdsTest, Lease4DelByAddrNotFound) {
         "}";
     string exp_rsp = "IPv4 lease not found.";
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
 }
 
 // Checks that lease4-del can return a lease by address.
 TEST_F(LeaseCmdsTest, Lease4DelByAddr) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Query for valid, existing lease.
     string cmd =
         "{\n"
@@ -4063,6 +4976,12 @@ TEST_F(LeaseCmdsTest, Lease4DelByAddr) {
     string exp_rsp = "IPv4 lease deleted.";
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Make sure the lease is really gone.
     EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.1")));
 }
@@ -4098,9 +5017,18 @@ TEST_F(LeaseCmdsTest, LeaseXDelBadUpdateDdnsParam) {
 // Checks that lease4-del sanitizes its input.
 TEST_F(LeaseCmdsTest, Lease4DelByAddrBadParam) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Invalid family
     string cmd =
         "{\n"
@@ -4112,6 +5040,12 @@ TEST_F(LeaseCmdsTest, Lease4DelByAddrBadParam) {
     string exp_rsp = "Invalid IPv4 address specified: 2001:db8:1::1";
     testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // This is way off
     cmd =
         "{\n"
@@ -4128,9 +5062,18 @@ TEST_F(LeaseCmdsTest, Lease4DelByAddrBadParam) {
 // well formed, but the lease is not there.
 TEST_F(LeaseCmdsTest, Lease4DelByHWAddrNotFound) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // No such lease.
     string cmd =
         "{\n"
@@ -4144,6 +5087,12 @@ TEST_F(LeaseCmdsTest, Lease4DelByHWAddrNotFound) {
     string exp_rsp = "IPv4 lease not found.";
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Make sure the lease is still there.
     EXPECT_TRUE(lmptr_->getLease4(IOAddress("192.0.2.1")));
 }
@@ -4151,9 +5100,18 @@ TEST_F(LeaseCmdsTest, Lease4DelByHWAddrNotFound) {
 // Checks that lease4-del can find a lease by hardware address.
 TEST_F(LeaseCmdsTest, Lease4DelByHWAddr) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Invalid
     string cmd =
         "{\n"
@@ -4167,6 +5125,12 @@ TEST_F(LeaseCmdsTest, Lease4DelByHWAddr) {
     string exp_rsp = "IPv4 lease deleted.";
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Make sure the lease is really gone.
     EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.1")));
 }
@@ -4175,9 +5139,18 @@ TEST_F(LeaseCmdsTest, Lease4DelByHWAddr) {
 // well formed, but the lease is not there.
 TEST_F(LeaseCmdsTest, Lease4DelByClientIdNotFound) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // No such lease.
     string cmd =
         "{\n"
@@ -4191,15 +5164,30 @@ TEST_F(LeaseCmdsTest, Lease4DelByClientIdNotFound) {
     string exp_rsp = "IPv4 lease not found.";
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Make sure the lease is still there.
     EXPECT_TRUE(lmptr_->getLease4(IOAddress("192.0.2.1")));
 }
 
 // Checks that lease4-del can find and delete a lease by client identifier.
 TEST_F(LeaseCmdsTest, Lease4DelByClientId) {
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Invalid
     string cmd =
         "{\n"
@@ -4213,6 +5201,12 @@ TEST_F(LeaseCmdsTest, Lease4DelByClientId) {
     string exp_rsp = "IPv4 lease deleted.";
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Make sure the lease is really gone.
     EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.1")));
 }
@@ -4221,9 +5215,24 @@ TEST_F(LeaseCmdsTest, Lease4DelByClientId) {
 // the query is correctly formed, but the lease is not there.
 TEST_F(LeaseCmdsTest, Lease6DelByAddr6NotFound) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4238,15 +5247,42 @@ TEST_F(LeaseCmdsTest, Lease6DelByAddr6NotFound) {
     // Note the status expected is empty. The query completed correctly,
     // just didn't found the lease.
     testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
 }
 
 // Checks that lease6-del(subnet-id, addr) can handle a situation when
 // the query is correctly formed, but the lease is not there.
 TEST_F(LeaseCmdsTest, Lease6DelByDuidNotFound) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4263,6 +5299,18 @@ TEST_F(LeaseCmdsTest, Lease6DelByDuidNotFound) {
     // just didn't found the lease.
     testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Make sure the lease is still there.
     EXPECT_TRUE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1")));
 }
@@ -4273,6 +5321,21 @@ TEST_F(LeaseCmdsTest, Lease6DelByAddr) {
 
     initLeaseMgr(true, true); // (true = v6, true = create a lease)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4287,6 +5350,18 @@ TEST_F(LeaseCmdsTest, Lease6DelByAddr) {
     // The status expected is success. The lease should be deleted.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Make sure the lease is really gone.
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1")));
 }
@@ -4294,9 +5369,12 @@ TEST_F(LeaseCmdsTest, Lease6DelByAddr) {
 // Checks that lease6-del sanitizes its input.
 TEST_F(LeaseCmdsTest, Lease6DelByAddrBadParam) {
 
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Invalid family
     string cmd =
         "{\n"
@@ -4324,7 +5402,22 @@ TEST_F(LeaseCmdsTest, Lease6DelByAddrBadParam) {
 // the query is correctly formed and the lease is deleted.
 TEST_F(LeaseCmdsTest, Lease6DelByAddrPrefix) {
 
-    initLeaseMgr(true, false); // (true = v6, false = don't add any leases)
+    initLeaseMgr(true, false); // (true = v6, false = don't add leases)
+
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
 
     // Let's start with regular address lease and make it a prefix lease.
     Lease6Ptr l = createLease6("2001:db8:1::1", 66, 0x77);
@@ -4333,6 +5426,22 @@ TEST_F(LeaseCmdsTest, Lease6DelByAddrPrefix) {
     l->prefixlen_ = 56;
     lmptr_->addLease(l);
 
+    StatsMgr::instance().setValue(StatsMgr::generateName("subnet", 66,
+                                                         "assigned-pds" ),
+                                  int64_t(1));
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4347,6 +5456,18 @@ TEST_F(LeaseCmdsTest, Lease6DelByAddrPrefix) {
     // The status expected is success. The lease should be deleted.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Make sure the lease is really gone.
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_PD, IOAddress("2001:db8:1234:ab::")));
 }
@@ -4357,6 +5478,21 @@ TEST_F(LeaseCmdsTest, Lease6DelByDUID) {
 
     initLeaseMgr(true, true); // (true = v6, true = create a lease)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4373,6 +5509,18 @@ TEST_F(LeaseCmdsTest, Lease6DelByDUID) {
     // The status expected is success. The lease should be deleted.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Make sure the lease is really gone.
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1")));
 }
@@ -4380,9 +5528,18 @@ TEST_F(LeaseCmdsTest, Lease6DelByDUID) {
 // Checks that lease4-wipe can remove leases.
 TEST_F(LeaseCmdsTest, Lease4Wipe) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Query for valid, existing lease.
     string cmd =
         "{\n"
@@ -4394,6 +5551,12 @@ TEST_F(LeaseCmdsTest, Lease4Wipe) {
     string exp_rsp = "Deleted 2 IPv4 lease(s) from subnet(s) 44";
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Make sure the leases in subnet 44 are really gone.
     EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.1")));
     EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.2")));
@@ -4407,9 +5570,18 @@ TEST_F(LeaseCmdsTest, Lease4Wipe) {
 // at once.
 TEST_F(LeaseCmdsTest, Lease4WipeAll) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Query for valid, existing lease.
     string cmd =
         "{\n"
@@ -4421,6 +5593,12 @@ TEST_F(LeaseCmdsTest, Lease4WipeAll) {
     string exp_rsp = "Deleted 4 IPv4 lease(s) from subnet(s) 44 88";
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Make sure the leases in subnet 44 are really gone.
     EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.1")));
     EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.2")));
@@ -4434,9 +5612,18 @@ TEST_F(LeaseCmdsTest, Lease4WipeAll) {
 // at once (when no parameters are specifed).
 TEST_F(LeaseCmdsTest, Lease4WipeAllNoArgs) {
 
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 2);
+
     // Query for valid, existing lease.
     string cmd =
         "{\n"
@@ -4445,6 +5632,12 @@ TEST_F(LeaseCmdsTest, Lease4WipeAllNoArgs) {
     string exp_rsp = "Deleted 4 IPv4 lease(s) from subnet(s) 44 88";
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Make sure the leases in subnet 44 are really gone.
     EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.1")));
     EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.2")));
@@ -4457,9 +5650,18 @@ TEST_F(LeaseCmdsTest, Lease4WipeAllNoArgs) {
 // Checks that lease4-wipe properly reports when no leases were deleted.
 TEST_F(LeaseCmdsTest, Lease4WipeNoLeases) {
 
-    // Initialize lease manager (false = v4, false = no leases)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Query for valid, existing lease.
     string cmd =
         "{\n"
@@ -4470,14 +5672,29 @@ TEST_F(LeaseCmdsTest, Lease4WipeNoLeases) {
         "}";
     string exp_rsp = "Deleted 0 IPv4 lease(s) from subnet(s) 44";
     testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
 }
 
 // Checks that lease4-wipe properly reports when no leases were deleted.
 TEST_F(LeaseCmdsTest, Lease4WipeNoLeasesAll) {
 
-    // Initialize lease manager (false = v4, false = no leases)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
+
     // Query for valid, existing lease.
     string cmd =
         "{\n"
@@ -4488,6 +5705,12 @@ TEST_F(LeaseCmdsTest, Lease4WipeNoLeasesAll) {
         "}";
     string exp_rsp = "Deleted 0 IPv4 lease(s) from subnet(s) 44 88";
     testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              44, "assigned-addresses"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              88, "assigned-addresses"))->getInteger().first, 0);
 }
 
 // Checks that lease4-wipe can remove leases.
@@ -4495,6 +5718,21 @@ TEST_F(LeaseCmdsTest, Lease6Wipe) {
 
     initLeaseMgr(true, true); // (true = v6, true = create a lease)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4508,11 +5746,23 @@ TEST_F(LeaseCmdsTest, Lease6Wipe) {
     // The status expected is success. The lease should be deleted.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
-    // Make sure the leases in subnet 44 are really gone.
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
+    // Make sure the leases in subnet 66 are really gone.
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1")));
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::2")));
 
-    // The leases in subnet 88 are supposed to be still there.
+    // Make sure the leases from subnet 99 are still there.
     EXPECT_TRUE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::1")));
     EXPECT_TRUE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::2")));
 }
@@ -4522,6 +5772,21 @@ TEST_F(LeaseCmdsTest, Lease6WipeAll) {
 
     initLeaseMgr(true, true); // (true = v6, true = create a lease)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4535,11 +5800,23 @@ TEST_F(LeaseCmdsTest, Lease6WipeAll) {
     // The status expected is success. The lease should be deleted.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
-    // Make sure the leases in subnet 44 are really gone.
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
+    // Make sure the leases in subnet 66 are really gone.
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1")));
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::2")));
 
-    // The leases in subnet 88 are supposed to be still there.
+    // Make sure the leases from subnet 99 are gone, too.
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::1")));
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::2")));
 }
@@ -4550,6 +5827,21 @@ TEST_F(LeaseCmdsTest, Lease6WipeAllNoArgs) {
 
     initLeaseMgr(true, true); // (true = v6, true = create a lease)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4560,11 +5852,23 @@ TEST_F(LeaseCmdsTest, Lease6WipeAllNoArgs) {
     // The status expected is success. The lease should be deleted.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
-    // Make sure the leases in subnet 44 are really gone.
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
+    // Make sure the leases in subnet 66 are really gone.
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1")));
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::2")));
 
-    // The leases in subnet 88 are supposed to be still there.
+    // Make sure the leases from subnet 99 are gone, too.
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::1")));
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::2")));
 }
@@ -4572,9 +5876,24 @@ TEST_F(LeaseCmdsTest, Lease6WipeAllNoArgs) {
 // Checks that lease4-wipe properly reports when no leases were deleted.
 TEST_F(LeaseCmdsTest, Lease6WipeNoLeases) {
 
-    // Initialize lease manager (false = v4, false = no leases)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(true, false);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Query for valid, existing lease.
     string cmd =
         "{\n"
@@ -4585,14 +5904,41 @@ TEST_F(LeaseCmdsTest, Lease6WipeNoLeases) {
         "}";
     string exp_rsp = "Deleted 0 IPv6 lease(s) from subnet(s) 66";
     testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
 }
 
 // Checks that lease4-wipe properly reports when no leases were deleted.
 TEST_F(LeaseCmdsTest, Lease6WipeNoLeasesAll) {
 
-    // Initialize lease manager (false = v4, false = no leases)
+    // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(true, false);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Query for valid, existing lease.
     string cmd =
         "{\n"
@@ -4603,6 +5949,18 @@ TEST_F(LeaseCmdsTest, Lease6WipeNoLeasesAll) {
         "}";
     string exp_rsp = "Deleted 0 IPv6 lease(s) from subnet(s) 66 99";
     testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
 }
 
 // Checks that an attempt to update a lease (set incorrect subnet-id)
@@ -4612,13 +5970,13 @@ TEST_F(LeaseCmdsTest, brokenUpdate) {
     // Initialize lease manager (false = v4, false = don't add leases)
     initLeaseMgr(false, false);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Set the sanity checks level.
     CfgMgr::instance().getCurrentCfg()->getConsistency()
         ->setLeaseSanityCheck(CfgConsistency::LEASE_CHECK_FIX);
 
-    // Check that the lease manager pointer is there.
-    ASSERT_TRUE(lmptr_);
-
     // Now send the command.
     string txt =
         "{\n"
@@ -4641,6 +5999,21 @@ TEST_F(LeaseCmdsTest, Lease6BulkApply) {
 
     initLeaseMgr(true, true); // (true = v6, true = create leases)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4677,7 +6050,19 @@ TEST_F(LeaseCmdsTest, Lease6BulkApply) {
     // The status expected is success.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
-    // Check that the leases we inserted are stored.
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 3);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
+    //  Check that the leases we inserted are stored.
     EXPECT_TRUE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::123")));
     EXPECT_TRUE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::123")));
 
@@ -4727,6 +6112,21 @@ TEST_F(LeaseCmdsTest, Lease6BulkApplyAddsOnly) {
 
     initLeaseMgr(true, false); // (true = v6, true = create leases)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4753,7 +6153,19 @@ TEST_F(LeaseCmdsTest, Lease6BulkApplyAddsOnly) {
     // The status expected is success.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
-    // Check that the leases we inserted are stored.
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 1);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
+    //  Check that the leases we inserted are stored.
     EXPECT_TRUE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::123")));
     EXPECT_TRUE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::123")));
 }
@@ -4810,6 +6222,21 @@ TEST_F(LeaseCmdsTest, Lease6BulkApplyUpdatesOnly) {
 
     initLeaseMgr(true, true); // (true = v6, true = create leases)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4836,7 +6263,19 @@ TEST_F(LeaseCmdsTest, Lease6BulkApplyUpdatesOnly) {
     // The status expected is success.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
-    // Check that the leases we inserted are stored.
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
+    //  Check that the leases we inserted are stored.
     Lease6Ptr lease1 = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"));
     Lease6Ptr lease2 = lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::2"));
     ASSERT_TRUE(lease1);
@@ -4853,6 +6292,21 @@ TEST_F(LeaseCmdsTest, Lease6BulkApplyDeletesOnly) {
 
     initLeaseMgr(true, true); // (true = v6, true = create leases)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4875,6 +6329,18 @@ TEST_F(LeaseCmdsTest, Lease6BulkApplyDeletesOnly) {
     // The status expected is success.
     testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Check that the leases we deleted are gone,
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1")));
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::2")));
@@ -4886,6 +6352,21 @@ TEST_F(LeaseCmdsTest, Lease6BulkApplyDeleteNonExiting) {
 
     initLeaseMgr(true, true); // (true = v6, true = create leases)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4910,6 +6391,18 @@ TEST_F(LeaseCmdsTest, Lease6BulkApplyDeleteNonExiting) {
     ASSERT_TRUE(resp);
     ASSERT_EQ(Element::map, resp->getType());
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     auto args = resp->get("arguments");
     ASSERT_TRUE(args);
     ASSERT_EQ(Element::map, args->getType());
@@ -4938,6 +6431,21 @@ TEST_F(LeaseCmdsTest, Lease6BulkApplyRollback) {
 
     initLeaseMgr(true, true); // (true = v6, true = create leases)
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     // Now send the command.
     string cmd =
         "{\n"
@@ -4974,6 +6482,18 @@ TEST_F(LeaseCmdsTest, Lease6BulkApplyRollback) {
     // The status expected is success.
     testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
 
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              66, "assigned-pds"))->getInteger().first, 0);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-nas"))->getInteger().first, 2);
+
+    ASSERT_EQ(StatsMgr::instance().getObservation(StatsMgr::generateName("subnet",
+              99, "assigned-pds"))->getInteger().first, 0);
+
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::123")));
     EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::123")));
 
@@ -4983,9 +6503,12 @@ TEST_F(LeaseCmdsTest, Lease6BulkApplyRollback) {
 
 // Checks that lease4-resend-ddns sanitizes its input.
 TEST_F(LeaseCmdsTest, Lease4ResendDdnsBadParam) {
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Missing address parameter.
     string cmd =
         "{\n"
@@ -5025,8 +6548,12 @@ TEST_F(LeaseCmdsTest, Lease4ResendDdnsBadParam) {
 // Checks that lease4-resend-ddns does not generate an NCR for given lease
 // when DDNS updating is disabled.
 TEST_F(LeaseCmdsTest, lease4ResendDdnsDisabled) {
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
+
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     disableD2();
 
     // Query for valid, existing lease.
@@ -5044,13 +6571,15 @@ TEST_F(LeaseCmdsTest, lease4ResendDdnsDisabled) {
     EXPECT_EQ(ncrQueueSize(), -1);
 }
 
-
 // Checks that lease4-resend-ddns does not generate an NCR for
 // when there is no matching lease.
 TEST_F(LeaseCmdsTest, lease4ResendDdnsNoLease) {
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Invalid
     string cmd =
         "{\n"
@@ -5066,9 +6595,12 @@ TEST_F(LeaseCmdsTest, lease4ResendDdnsNoLease) {
 // Checks that lease4-resend-ddns does not generate an NCR for given lease
 // when updates are enabled but Lease::hostname_ is blank.
 TEST_F(LeaseCmdsTest, lease4ResendNoHostname) {
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // NCR sender queue should be empty.
     ASSERT_EQ(ncrQueueSize(), 0);
 
@@ -5098,9 +6630,12 @@ TEST_F(LeaseCmdsTest, lease4ResendNoHostname) {
 // when updates are enabled, Lease::hostname_ is not blank, but both
 // Lease::fqdn_fwd_ and fdqn_rev_ are false.
 TEST_F(LeaseCmdsTest, lease4ResendNoDirectionsEnabled) {
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // NCR sender queue should be empty.
     ASSERT_EQ(ncrQueueSize(), 0);
 
@@ -5131,9 +6666,12 @@ TEST_F(LeaseCmdsTest, lease4ResendNoDirectionsEnabled) {
 // when updates are enabled, Lease::hostname_ is not blank, and at least
 // one of Lease::fqdn_fwd_ or fdqn_rev_ are true.
 TEST_F(LeaseCmdsTest, lease4ResendDdnsEnabled) {
-    // Initialize lease manager (false = v4, true = add a lease)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Structure detailing a test scenario.
     struct Scenario {
         std::string description_;
@@ -5183,9 +6721,12 @@ TEST_F(LeaseCmdsTest, lease4ResendDdnsEnabled) {
 
 // Checks that lease6-resend-ddns sanitizes its input.
 TEST_F(LeaseCmdsTest, Lease6ResendDdnsBadParam) {
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Missing address parameter.
     string cmd =
         "{\n"
@@ -5225,9 +6766,12 @@ TEST_F(LeaseCmdsTest, Lease6ResendDdnsBadParam) {
 // Checks that lease6-resend-ddns does not generate an NCR for given lease
 // when DDNS updating is disabled.
 TEST_F(LeaseCmdsTest, lease6ResendDdnsDisabled) {
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Disable DDNS updating.
     disableD2();
 
@@ -5249,9 +6793,12 @@ TEST_F(LeaseCmdsTest, lease6ResendDdnsDisabled) {
 // Checks that lease6-resend-ddns does not generate an NCR for
 // when there is no matching lease.
 TEST_F(LeaseCmdsTest, lease6ResendDdnsNoLease) {
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Invalid
     string cmd =
         "{\n"
@@ -5264,13 +6811,15 @@ TEST_F(LeaseCmdsTest, lease6ResendDdnsNoLease) {
     ConstElementPtr rsp = testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
 }
 
-
 // Checks that lease6-resend-ddns does not generate an NCR for given lease
 // when updates are enabled but Lease::hostname_ is blank.
 TEST_F(LeaseCmdsTest, lease6ResendNoHostname) {
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // NCR sender queue should be empty.
     ASSERT_EQ(ncrQueueSize(), 0);
 
@@ -5300,9 +6849,12 @@ TEST_F(LeaseCmdsTest, lease6ResendNoHostname) {
 // when updates are enabled, Lease::hostname_ is not blank, but both
 // Lease::fqdn_fwd_ and fdqn_rev_ are false.
 TEST_F(LeaseCmdsTest, lease6ResendNoDirectionsEnabled) {
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // NCR sender queue should be empty.
     ASSERT_EQ(ncrQueueSize(), 0);
 
@@ -5333,9 +6885,12 @@ TEST_F(LeaseCmdsTest, lease6ResendNoDirectionsEnabled) {
 // when updates are enabled, Lease::hostname_ is not blank, and at least
 // one of Lease::fqdn_fwd_ or fdqn_rev_ are true.
 TEST_F(LeaseCmdsTest, lease6ResendDdnsEnabled) {
-    // Initialize lease manager (true = v6, true = add a lease)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Structure detailing a test scenario.
     struct Scenario {
         std::string description_;
@@ -5386,9 +6941,12 @@ TEST_F(LeaseCmdsTest, lease6ResendDdnsEnabled) {
 // Checks that lease4-del does (or does not) generate an NCR to remove
 // DNS for a given lease based on lease content when DDNS updates are enabled.
 TEST_F(LeaseCmdsTest, lease4DnsRemoveD2Enabled) {
-    // Initialize lease manager (false = v4, true = leases)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(false, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Structure detailing a test scenario.
     struct Scenario {
         std::string description_;
@@ -5506,8 +7064,12 @@ TEST_F(LeaseCmdsTest, lease4DnsRemoveD2Enabled) {
 // DNS for a given lease based on lease content when DDNS
 // updates are disabled.
 TEST_F(LeaseCmdsTest, lease4DnsRemoveD2Disabled) {
-    // Initialize lease manager (false = v4, true = leases)
+    // Initialize lease manager (false = v4, true = add leases)
     initLeaseMgr(true, true);
+
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     disableD2();
 
     // Delete for valid, existing lease.
@@ -5545,9 +7107,12 @@ TEST_F(LeaseCmdsTest, lease4DnsRemoveD2Disabled) {
 // Checks that lease6-del does (or does not) generate an NCR to remove
 // DNS for a given lease based on lease content when DDNS updates are enabled.
 TEST_F(LeaseCmdsTest, lease6DnsRemoveD2Enabled) {
-    // Initialize lease manager (true = v6, false = no leases)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
 
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     // Structure detailing a test scenario.
     struct Scenario {
         std::string description_;
@@ -5665,8 +7230,12 @@ TEST_F(LeaseCmdsTest, lease6DnsRemoveD2Enabled) {
 // DNS for a given lease based on lease content when DDNS
 // updates are disabled.
 TEST_F(LeaseCmdsTest, lease6DnsRemoveD2Disabled) {
-    // Initialize lease manager (true = v6, true = leases)
+    // Initialize lease manager (true = v6, true = add leases)
     initLeaseMgr(true, true);
+
+    // Check that the lease manager pointer is there.
+    ASSERT_TRUE(lmptr_);
+
     disableD2();
 
     // Delete for valid, existing lease.
index a1a709b0e7c277011a3203433f285189f7f6f1b8..08217247f7d342a16b5882a528f9ebf500c5243f 100644 (file)
@@ -1072,7 +1072,6 @@ AllocEngine::allocateUnreservedLeases6(ClientContext6& ctx) {
                     continue;
                 }
 
-
                 // there's no existing lease for selected candidate, so it is
                 // free. Let's allocate it.
 
@@ -3838,7 +3837,8 @@ AllocEngine::renewLease4(const Lease4Ptr& lease,
         LeaseMgrFactory::instance().updateLease4(lease);
 
         // We need to account for the re-assignment of The lease.
-        if (ctx.old_lease_->expired() || ctx.old_lease_->state_ == Lease::STATE_EXPIRED_RECLAIMED) {
+        if (ctx.old_lease_->checkUpdateStats()) {
+
             StatsMgr::instance().addValue(
                 StatsMgr::generateName("subnet", ctx.subnet_->getID(),
                                        "assigned-addresses"),
@@ -4257,7 +4257,6 @@ AllocEngine::updateLease6ExtendedInfo(const Lease6Ptr& lease,
     lease->setContext(user_context);
 }
 
-
 bool
 AllocEngine::conditionalExtendLifetime(Lease& lease) const {
     lease.cltt_ = time(NULL);
index c9c8ba969940af3195d503e75cc235c8fef1253b..542a74b9a553707cf6146a5fd994611e3e21e601 100644 (file)
@@ -130,6 +130,11 @@ Lease::hasIdenticalFqdn(const Lease& other) const {
             fqdn_rev_ == other.fqdn_rev_);
 }
 
+bool
+Lease::checkUpdateStats() const {
+    return (expired() || stateExpiredReclaimed());
+}
+
 void
 Lease::fromElementCommon(const LeasePtr& lease, const data::ConstElementPtr& element) {
     if (!element) {
index a9e27fd023e645834a40c8ec79f12132d9314461..52c7a716b478b6fa5fc922d3a499ffd4a5be4d48 100644 (file)
@@ -227,6 +227,12 @@ struct Lease : public isc::data::UserContext, public isc::data::CfgToElement {
     /// @param probation_period lease lifetime will be set to this value
     virtual void decline(uint32_t probation_period) = 0;
 
+    /// @brief Check lease for expiration or reclaimed state.
+    ///
+    /// @return true if the lease is expired or in reclaimed state, false
+    /// otherwise.
+    bool checkUpdateStats() const;
+
     /// Avoid a clang spurious error
     using isc::data::CfgToElement::toElement;