PEL: Tell HostNotifier about deleted PELs

Have the HostNotifier class subscribe to the Repository class's PEL
deletion callbacks so that when a PEL is deleted HostNotifier can remove
that PEL from its queue and also from its sent list.

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I37c61bd62f208512e0c45a628548e0881272d2f5
diff --git a/extensions/openpower-pels/host_notifier.cpp b/extensions/openpower-pels/host_notifier.cpp
index 175a644..b268c9c 100644
--- a/extensions/openpower-pels/host_notifier.cpp
+++ b/extensions/openpower-pels/host_notifier.cpp
@@ -40,6 +40,12 @@
                           std::bind(std::mem_fn(&HostNotifier::newLogCallback),
                                     this, std::placeholders::_1));
 
+    // Subscribe to be told about deleted PELs.
+    _repo.subscribeToDeletes(
+        subscriptionName,
+        std::bind(std::mem_fn(&HostNotifier::deleteLogCallback), this,
+                  std::placeholders::_1));
+
     // Add any existing PELs to the queue to send them if necessary.
     _repo.for_each(std::bind(std::mem_fn(&HostNotifier::addPELToQueue), this,
                              std::placeholders::_1));
@@ -188,6 +194,31 @@
     }
 }
 
+void HostNotifier::deleteLogCallback(uint32_t id)
+{
+    auto queueIt = std::find(_pelQueue.begin(), _pelQueue.end(), id);
+    if (queueIt != _pelQueue.end())
+    {
+        log<level::DEBUG>("Host notifier removing deleted log from queue");
+        _pelQueue.erase(queueIt);
+    }
+
+    auto sentIt = std::find(_sentPELs.begin(), _sentPELs.end(), id);
+    if (sentIt != _sentPELs.end())
+    {
+        log<level::DEBUG>("Host notifier removing deleted log from sent list");
+        _sentPELs.erase(sentIt);
+    }
+
+    // Nothing we can do about this...
+    if (id == _inProgressPEL)
+    {
+        log<level::WARNING>(
+            "A PEL was deleted while its host notification was in progress",
+            entry("PEL_ID=0x%X", id));
+    }
+}
+
 void HostNotifier::scheduleDispatch()
 {
     _dispatcher = std::make_unique<sdeventplus::source::Defer>(
diff --git a/extensions/openpower-pels/host_notifier.hpp b/extensions/openpower-pels/host_notifier.hpp
index cad2b36..24c3f6f 100644
--- a/extensions/openpower-pels/host_notifier.hpp
+++ b/extensions/openpower-pels/host_notifier.hpp
@@ -171,6 +171,17 @@
     void newLogCallback(const PEL& pel);
 
     /**
+     * @brief This function gets called by the Repository class
+     *        when a PEL is deleted.
+     *
+     * The deleted ID will be removed from the PEL queue and the
+     * sent list.
+     *
+     * @param[in] id - The deleted PEL ID
+     */
+    void deleteLogCallback(uint32_t id);
+
+    /**
      * @brief This function runs on every existing PEL at startup
      *        and puts the PEL on the queue to send if necessary.
      *