OEM Route Handling Infrastructure

Goal of the MR is to provide infrastructure support in bmcweb to manage
the OEM fragment handling separately. OEM schema are vendor defined and
per DMTF resource we could have multiple vendor defined OEM schema to be
enabled.

The feature allows registration of route handler per schema per OEM
namespace.
Example
```
REDFISH_SUB_ROUTE<"/redfish/v1/Managers/<str>/#/Oem/OpenBmc">(service,
 HttpVerb::Get)(oemOpenBmcCallback);
REDFISH_SUB_ROUTE<"/redfish/v1/Managers/<str>/#/Oem/Nvidia">(service,
 HttpVerb::Get)(oemNidiaCallback);
```

We can have separate vendor defined route handlers per resource. Each of
these route handlers can populate their own vendor specific OEM data.
The OEM code can be better organized and enabled/disabled as per the
platform needs. The current MR has the code changes related to handling
GET requests alone. The feature only supports requests
where the response payload is JSON.

Tests
- All UT cases passes
- New UT added for RF OEM router passes
- Service Validator passes on qemu
- GET Response on Manager/bmc resource contains the OEM fragment

```
curl -c cjar -b cjar -k -X GET https://127.0.0.1:2443/redfish/v1/Managers/bmc
{
  "@odata.id": "/redfish/v1/Managers/bmc",
  "@odata.type": "#Manager.v1_14_0.Manager",

  "Oem": {
    "OpenBmc": {
      "@odata.id": "/redfish/v1/Managers/bmc#/Oem/OpenBmc",
      "@odata.type": "#OpenBMCManager.v1_0_0.Manager",
      "Certificates": {
        "@odata.id": "/redfish/v1/Managers/bmc/Truststore/Certificates"
      }
    }
  },

  "UUID": "40575e98-90d7-4c10-9eb5-8d8a7156c9b9"
}
```

Change-Id: Ic82aa5fe760eda31e2792fbdfb6884ac3ea613dc
Signed-off-by: Rohit PAI <rohitpai77@gmail.com>
diff --git a/redfish-core/include/redfish.hpp b/redfish-core/include/redfish.hpp
index a9722d0..f92e4ef 100644
--- a/redfish-core/include/redfish.hpp
+++ b/redfish-core/include/redfish.hpp
@@ -3,6 +3,12 @@
 #pragma once
 
 #include "app.hpp"
+#include "async_resp.hpp"
+#include "http_request.hpp"
+#include "redfish_oem_routing.hpp"
+#include "verb.hpp"
+
+#include <memory>
 
 namespace redfish
 {
@@ -20,6 +26,40 @@
      * @param[in] app   Crow app on which Redfish will initialize
      */
     explicit RedfishService(App& app);
+
+    // Temporary change to make redfish instance available in other places
+    // like query delegation.
+    static RedfishService& getInstance(App& app)
+    {
+        static RedfishService redfish(app);
+        return redfish;
+    }
+
+    void validate()
+    {
+        oemRouter.validate();
+    }
+
+    template <StringLiteral Rule>
+    auto& newRoute(HttpVerb method)
+    {
+        return oemRouter.newRule<Rule>(method);
+    }
+
+    void handleSubRoute(
+        const crow::Request& req,
+        const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) const
+    {
+        oemRouter.handle(req, asyncResp);
+    }
+
+    OemRouter oemRouter;
 };
 
+template <StringLiteral Path>
+auto& REDFISH_SUB_ROUTE(RedfishService& service, HttpVerb method)
+{
+    return service.newRoute<Path>(method);
+}
+
 } // namespace redfish