Redfish: Support for DownloadLog Action

Supports offloading a dump to the client

Tested-By:

* curl -k -H "X-Auth-Token: $bmc_token" -X GET
https://${bmc}/redfish/v1/Managers/bmc/LogServices/
Dump/attachment/<dump-id>

* curl -k -H "X-Auth-Token: $bmc_token" -X GET
https://${bmc}/redfish/v1/Systems/system/LogServices/
Dump/attachment/<dump-id>

Signed-off-by: Asmitha Karunanithi <asmitk01@in.ibm.com>
Change-Id: I99bbb50bc171408273744f89220a46bfe64ba4c4
diff --git a/redfish-core/include/redfish.hpp b/redfish-core/include/redfish.hpp
index 2e568da..bdec359 100644
--- a/redfish-core/include/redfish.hpp
+++ b/redfish-core/include/redfish.hpp
@@ -116,6 +116,7 @@
         nodes.emplace_back(std::make_unique<BMCDumpEntryCollection>(app));
         nodes.emplace_back(std::make_unique<BMCDumpEntry>(app));
         nodes.emplace_back(std::make_unique<BMCDumpCreate>(app));
+        nodes.emplace_back(std::make_unique<BMCDumpEntryDownload>(app));
         nodes.emplace_back(std::make_unique<BMCDumpClear>(app));
 #endif
 
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index b572bbf..aed37b0 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -2140,6 +2140,36 @@
     }
 };
 
+class BMCDumpEntryDownload : public Node
+{
+  public:
+    BMCDumpEntryDownload(CrowApp& app) :
+        Node(app, "/redfish/v1/Managers/bmc/LogServices/Dump/attachment/<str>/",
+             std::string())
+    {
+        entityPrivileges = {
+            {boost::beast::http::verb::get, {{"Login"}}},
+            {boost::beast::http::verb::head, {{"Login"}}},
+            {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
+            {boost::beast::http::verb::put, {{"ConfigureManager"}}},
+            {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
+            {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
+    }
+
+  private:
+    void doGet(crow::Response& res, const crow::Request& req,
+               const std::vector<std::string>& params) override
+    {
+        if (params.size() != 1)
+        {
+            messages::internalError(res);
+            return;
+        }
+        const std::string& entryID = params[0];
+        crow::obmc_dump::handleDumpOffloadUrl(req, res, entryID);
+    }
+};
+
 class BMCDumpClear : public Node
 {
   public:
@@ -2319,20 +2349,21 @@
   public:
     SystemDumpEntryDownload(CrowApp& app) :
         Node(app,
-             "/redfish/v1/Systems/system/LogServices/System/Entries/<str>/"
-             "Actions/"
-             "LogEntry.DownloadLog/",
+             "/redfish/v1/Systems/system/LogServices/Dump/attachment/<str>/",
              std::string())
     {
         entityPrivileges = {
             {boost::beast::http::verb::get, {{"Login"}}},
             {boost::beast::http::verb::head, {{"Login"}}},
+            {boost::beast::http::verb::patch, {{"ConfigureManager"}}},
+            {boost::beast::http::verb::put, {{"ConfigureManager"}}},
+            {boost::beast::http::verb::delete_, {{"ConfigureManager"}}},
             {boost::beast::http::verb::post, {{"ConfigureManager"}}}};
     }
 
   private:
-    void doPost(crow::Response& res, const crow::Request& req,
-                const std::vector<std::string>& params) override
+    void doGet(crow::Response& res, const crow::Request& req,
+               const std::vector<std::string>& params) override
     {
         if (params.size() != 1)
         {