From 64b35026421f6272621303b46c166f0de13f6104 Mon Sep 17 00:00:00 2001 From: Tomek Mrugalski Date: Mon, 13 Aug 2018 17:47:53 +0200 Subject: [PATCH] [gitlab9] Imported relevant bits from github99 - Covers changes up to 4358737d43ee1b6c8618a1a8aa3cc7273634ed48, but without unnecessary things. --- src/lib/dhcpsrv/cql_lease_mgr.cc | 32 +++++++++++++++++++ src/lib/dhcpsrv/cql_lease_mgr.h | 5 +++ src/lib/dhcpsrv/lease_mgr.h | 5 +++ src/lib/dhcpsrv/memfile_lease_mgr.cc | 13 ++++++++ src/lib/dhcpsrv/memfile_lease_mgr.h | 6 ++++ src/lib/dhcpsrv/mysql_lease_mgr.cc | 19 ++++++++++- src/lib/dhcpsrv/mysql_lease_mgr.h | 6 ++++ src/lib/dhcpsrv/pgsql_lease_mgr.cc | 19 +++++++++++ src/lib/dhcpsrv/pgsql_lease_mgr.h | 6 ++++ src/lib/dhcpsrv/tests/lease_mgr_unittest.cc | 8 +++++ .../testutils/host_data_source_utils.cc | 3 +- 11 files changed, 120 insertions(+), 2 deletions(-) diff --git a/src/lib/dhcpsrv/cql_lease_mgr.cc b/src/lib/dhcpsrv/cql_lease_mgr.cc index 7085ff436c..7ae9dc02d8 100644 --- a/src/lib/dhcpsrv/cql_lease_mgr.cc +++ b/src/lib/dhcpsrv/cql_lease_mgr.cc @@ -901,6 +901,7 @@ public: static constexpr StatementTag DELETE_LEASE6 = "DELETE_LEASE6"; static constexpr StatementTag GET_LEASE6_EXPIRE = "GET_LEASE6_EXPIRE"; static constexpr StatementTag GET_LEASE6_ADDR = "GET_LEASE6_ADDR"; + static constexpr StatementTag GET_LEASE6_DUID = "GET_LEASE6_DUID"; static constexpr StatementTag GET_LEASE6_DUID_IAID = "GET_LEASE6_DUID_IAID"; static constexpr StatementTag GET_LEASE6_DUID_IAID_SUBID = "GET_LEASE6_DUID_IAID_SUBID"; static constexpr StatementTag GET_LEASE6_LIMIT = "GET_LEASE6_LIMIT"; @@ -941,6 +942,7 @@ constexpr StatementTag CqlLease6Exchange::UPDATE_LEASE6; constexpr StatementTag CqlLease6Exchange::DELETE_LEASE6; constexpr StatementTag CqlLease6Exchange::GET_LEASE6_EXPIRE; constexpr StatementTag CqlLease6Exchange::GET_LEASE6_ADDR; +constexpr StatementTag CqlLease6Exchange::GET_LEASE6_DUID; constexpr StatementTag CqlLease6Exchange::GET_LEASE6_DUID_IAID; constexpr StatementTag CqlLease6Exchange::GET_LEASE6_DUID_IAID_SUBID; constexpr StatementTag CqlLease6Exchange::GET_LEASE6_LIMIT; @@ -1015,6 +1017,17 @@ StatementMap CqlLease6Exchange::tagged_statements_ = { "AND lease_type = ? " "ALLOW FILTERING "}}, + // Gets an IPv6 lease with specified duid + {GET_LEASE6_DUID, + {GET_LEASE6_DUID, + "SELECT " + "address, valid_lifetime, expire, subnet_id, pref_lifetime, duid, iaid, " + "lease_type, prefix_len, fqdn_fwd, fqdn_rev, hostname, hwaddr, hwtype, " + "hwaddr_source, state " + "FROM lease6 " + "WHERE duid = ? " + "ALLOW FILTERING "}}, + // Gets an IPv6 lease(s) with specified duid and iaid {GET_LEASE6_DUID_IAID, {GET_LEASE6_DUID_IAID, @@ -2280,6 +2293,25 @@ CqlLeaseMgr::getLease6(Lease::Type lease_type, const IOAddress &addr) const { return (result); } +Lease6Collection +CqlLeaseMgr::getLeases6(const DUID& duid) const { + + // Set up the WHERE clause value + AnyArray data; + + CassBlob duid_data(duid.getDuid()); + + data.add(&duid_data); + + // Get the data. + Lease6Collection result; + std::unique_ptr exchange6(new CqlLease6Exchange(dbconn_)); + exchange6->getLeaseCollection(CqlLease6Exchange::GET_LEASE6_DUID, data, result); + + return (result); + +} + Lease6Collection CqlLeaseMgr::getLeases6(Lease::Type lease_type, const DUID &duid, uint32_t iaid) const { LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_CQL_GET_IAID_DUID) diff --git a/src/lib/dhcpsrv/cql_lease_mgr.h b/src/lib/dhcpsrv/cql_lease_mgr.h index 39382b2f4e..5b7650786a 100644 --- a/src/lib/dhcpsrv/cql_lease_mgr.h +++ b/src/lib/dhcpsrv/cql_lease_mgr.h @@ -317,6 +317,11 @@ public: /// this backend. virtual Lease6Collection getLeases6() const override; + /// @brief Returns all IPv6 leases. + /// + /// @return Lease collection (may be empty if no IPv6 lease found). + virtual Lease6Collection getLeases6(const DUID& duid) const; + /// @brief Returns range of IPv6 leases using paging. /// /// This method implements paged browsing of the lease database. The first diff --git a/src/lib/dhcpsrv/lease_mgr.h b/src/lib/dhcpsrv/lease_mgr.h index 642bb6b759..474b4badc1 100644 --- a/src/lib/dhcpsrv/lease_mgr.h +++ b/src/lib/dhcpsrv/lease_mgr.h @@ -458,6 +458,11 @@ public: /// @return Lease collection (may be empty if no IPv6 lease found). virtual Lease6Collection getLeases6() const = 0; + /// @brief Returns collection of lease for matching DUID + /// + /// @return Lease collection (may be empty if no IPv6 lease found for the DUID). + virtual Lease6Collection getLeases6(const DUID& duid) const = 0; + /// @brief Returns range of IPv6 leases using paging. /// /// This method implements paged browsing of the lease database. The first diff --git a/src/lib/dhcpsrv/memfile_lease_mgr.cc b/src/lib/dhcpsrv/memfile_lease_mgr.cc index a4b4a1114c..fde42392db 100644 --- a/src/lib/dhcpsrv/memfile_lease_mgr.cc +++ b/src/lib/dhcpsrv/memfile_lease_mgr.cc @@ -1015,6 +1015,19 @@ Memfile_LeaseMgr::getLeases6() const { return (collection); } +Lease6Collection +Memfile_LeaseMgr::getLeases6(const DUID& duid) const { + LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MEMFILE_GET6); + + Lease6Collection collection; + for (auto lease = storage6_.begin(); lease != storage6_.end(); ++lease ) { + if ( (**lease).duid_->getDuid() == duid.getDuid() ) + collection.push_back(Lease6Ptr(new Lease6(**lease))); + } + + return (collection); +} + Lease6Collection Memfile_LeaseMgr::getLeases6(const asiolink::IOAddress& lower_bound_address, const LeasePageSize& page_size) const { diff --git a/src/lib/dhcpsrv/memfile_lease_mgr.h b/src/lib/dhcpsrv/memfile_lease_mgr.h index 66dedccb0d..f14cc5c964 100644 --- a/src/lib/dhcpsrv/memfile_lease_mgr.h +++ b/src/lib/dhcpsrv/memfile_lease_mgr.h @@ -311,6 +311,12 @@ public: /// /// @return Lease collection (may be empty if no IPv6 lease found). virtual Lease6Collection getLeases6() const; + + /// @brief Returns IPv6 leases for the DUID. + /// + /// @todo: implement an optimised of the query using index. + /// @return Lease collection (may be empty if no IPv6 lease found) for the DUID. + virtual Lease6Collection getLeases6(const DUID& duid) const; /// @brief Returns range of IPv6 leases using paging. /// diff --git a/src/lib/dhcpsrv/mysql_lease_mgr.cc b/src/lib/dhcpsrv/mysql_lease_mgr.cc index 16c3327ce4..fdcd2a37b0 100644 --- a/src/lib/dhcpsrv/mysql_lease_mgr.cc +++ b/src/lib/dhcpsrv/mysql_lease_mgr.cc @@ -184,7 +184,7 @@ tagged_statements = { { "state, user_context " "FROM lease6 " "WHERE address = ? AND lease_type = ?"}, - {MySqlLeaseMgr::GET_LEASE6_DUID_IAID, + {MySqlLeaseMgr::GET_LEASE6_DUID_IAID, "SELECT address, duid, valid_lifetime, " "expire, subnet_id, pref_lifetime, " "lease_type, iaid, prefix_len, " @@ -2220,6 +2220,23 @@ MySqlLeaseMgr::getLeases6() const { return (result); } +Lease6Collection +MySqlLeaseMgr::getLeases6(const DUID& duid) const { + LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_MYSQL_GET_DUID); + + Lease6Collection result = getLeases6(); + + //erase the ones not containing the matching DUID + for (auto iter = result.begin(); iter != result.end(); + iter++) { + if ((*iter)->duid_->getDuid() != duid.getDuid()) { + result.erase(iter); + } + } + + return result; +} + Lease6Collection MySqlLeaseMgr::getLeases6(const asiolink::IOAddress& lower_bound_address, const LeasePageSize& page_size) const { diff --git a/src/lib/dhcpsrv/mysql_lease_mgr.h b/src/lib/dhcpsrv/mysql_lease_mgr.h index 64fe4710a3..332a9129f3 100644 --- a/src/lib/dhcpsrv/mysql_lease_mgr.h +++ b/src/lib/dhcpsrv/mysql_lease_mgr.h @@ -308,6 +308,12 @@ public: /// /// @return Lease collection (may be empty if no IPv6 lease found). virtual Lease6Collection getLeases6() const; + + /// @brief Returns all IPv6 leases for the DUID. + /// + /// @todo: implement an optimised of the query using index. + /// @return Lease collection (may be empty if no IPv6 lease found) for the DUID. + virtual Lease6Collection getLeases6(const DUID& duid) const; /// @brief Returns range of IPv6 leases using paging. /// diff --git a/src/lib/dhcpsrv/pgsql_lease_mgr.cc b/src/lib/dhcpsrv/pgsql_lease_mgr.cc index fc3bc0dfd0..a2ac2b7465 100644 --- a/src/lib/dhcpsrv/pgsql_lease_mgr.cc +++ b/src/lib/dhcpsrv/pgsql_lease_mgr.cc @@ -1506,6 +1506,25 @@ PgSqlLeaseMgr::getLeases6(SubnetID subnet_id) const { return (result); } +Lease6Collection +PgSqlLeaseMgr::getLeases6( const DUID& duid ) const { + LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, + DHCPSRV_PGSQL_GET_DUID) + .arg(duid.toText()); + + Lease6Collection result = getLeases6(); + + //erase the ones not containing the matching DUID + for (auto iter = result.begin(); iter != result.end(); + iter++) { + if ((*iter)->duid_->getDuid() != duid.getDuid()) { + result.erase(iter); + } + } + + return (result); +} + Lease6Collection PgSqlLeaseMgr::getLeases6() const { LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_PGSQL_GET6); diff --git a/src/lib/dhcpsrv/pgsql_lease_mgr.h b/src/lib/dhcpsrv/pgsql_lease_mgr.h index 8b69c46b97..15bd714a7d 100644 --- a/src/lib/dhcpsrv/pgsql_lease_mgr.h +++ b/src/lib/dhcpsrv/pgsql_lease_mgr.h @@ -280,6 +280,12 @@ public: /// /// @return Lease collection (may be empty if no IPv6 lease found). virtual Lease6Collection getLeases6() const; + + /// @brief Returns IPv6 leases for the DUID. + /// + /// @todo: implement an optimised of the query using index. + /// @return Lease collection (may be empty if no IPv6 lease found) for the DUID + virtual Lease6Collection getLeases6(const DUID& duid) const; /// @brief Returns range of IPv6 leases using paging. /// diff --git a/src/lib/dhcpsrv/tests/lease_mgr_unittest.cc b/src/lib/dhcpsrv/tests/lease_mgr_unittest.cc index d32379fe8d..40e262741a 100644 --- a/src/lib/dhcpsrv/tests/lease_mgr_unittest.cc +++ b/src/lib/dhcpsrv/tests/lease_mgr_unittest.cc @@ -208,6 +208,14 @@ public: return (leases6_); } + /// @brief Returns collection of lease for matching DUID + /// + /// @param duid ignored + /// @return whatever is set in leases6_ field + virtual Lease6Collection getLeases6(const DUID& duid) const { + return (leases6_); + } + /// @brief Returns all IPv6 leases for the particular subnet identifier. /// /// @param subnet_id subnet identifier. diff --git a/src/lib/dhcpsrv/testutils/host_data_source_utils.cc b/src/lib/dhcpsrv/testutils/host_data_source_utils.cc index d76038b167..69a5c626d5 100644 --- a/src/lib/dhcpsrv/testutils/host_data_source_utils.cc +++ b/src/lib/dhcpsrv/testutils/host_data_source_utils.cc @@ -81,7 +81,7 @@ HostDataSourceUtils::initializeHost4(const std::string& address, } HostPtr -HostDataSourceUtils::initializeHost6(std::string address, +HostDataSourceUtils::initializeHost6(const std::string address, Host::IdentifierType identifier, bool prefix, bool new_identifier, @@ -107,6 +107,7 @@ HostDataSourceUtils::initializeHost6(std::string address, ++subnet4; ++subnet6; + std::string default_string; HostPtr host(new Host(&ident[0], ident.size(), identifier, subnet4, subnet6, IOAddress("0.0.0.0"))); -- 2.47.2