Make a few changes to privileges commit

1. Create char* overloads for the things that need it.
2. Fix up a couple errant moves
3. Use the gtest APIs for testing container membership, rather than sort
4. Move the index management to vector rather than map to avoid a lookup
5. Remove errant use of .at()
6. Move privilege comparison into the privilege class, in order to keep
the bitset implementation private.  This removes the requirment on the
forward declaration of PrivilegeProvider, and the use of friend class
7. Remove unimplemented override strcutures.  Feel free to add them
back once implemented
8. Make setSignlePrivilege return a code if the set failed
9. Remove the need for an extra construction of a blank privileges
object for things that require no privileges.

Tested by: updating unit tests with the appropriate APIs.  Relevant
unit tests pass

Change-Id: Ie9cde003b6c865979b4cac086379d0a3473896ce
Signed-off-by: Ed Tanous <ed.tanous@intel.com>
diff --git a/redfish-core/lib/account_service.hpp b/redfish-core/lib/account_service.hpp
index dafa605..b58ff11 100644
--- a/redfish-core/lib/account_service.hpp
+++ b/redfish-core/lib/account_service.hpp
@@ -19,19 +19,11 @@
 
 namespace redfish {
 
-static OperationMap accountServiceOpMap = {
-    {crow::HTTPMethod::GET, {{"ConfigureUsers"}, {"ConfigureManager"}}},
-    {crow::HTTPMethod::HEAD, {{"Login"}}},
-    {crow::HTTPMethod::PATCH, {{"ConfigureUsers"}}},
-    {crow::HTTPMethod::PUT, {{"ConfigureUsers"}}},
-    {crow::HTTPMethod::DELETE, {{"ConfigureUsers"}}},
-    {crow::HTTPMethod::POST, {{"ConfigureUsers"}}}};
-
 class AccountService : public Node {
  public:
   template <typename CrowApp>
   AccountService(CrowApp& app)
-      : Node(app, EntityPrivileges(std::move(accountServiceOpMap)),
+      : Node(app,
              "/redfish/v1/AccountService/") {
     Node::json["@odata.id"] = "/redfish/v1/AccountService";
     Node::json["@odata.type"] = "#AccountService.v1_1_0.AccountService";
@@ -48,6 +40,14 @@
     Node::json["MaxPasswordLength"] = 20;
     Node::json["Accounts"]["@odata.id"] = "/redfish/v1/AccountService/Accounts";
     Node::json["Roles"]["@odata.id"] = "/redfish/v1/AccountService/Roles";
+
+    entityPrivileges = {
+        {crow::HTTPMethod::GET, {{"ConfigureUsers"}, {"ConfigureManager"}}},
+        {crow::HTTPMethod::HEAD, {{"Login"}}},
+        {crow::HTTPMethod::PATCH, {{"ConfigureUsers"}}},
+        {crow::HTTPMethod::PUT, {{"ConfigureUsers"}}},
+        {crow::HTTPMethod::DELETE, {{"ConfigureUsers"}}},
+        {crow::HTTPMethod::POST, {{"ConfigureUsers"}}}};
   }
 
  private:
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index 0a56da7..ad042cb 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -19,27 +19,9 @@
 
 namespace redfish {
 
-static OperationMap managerOpMap = {
-    {crow::HTTPMethod::GET, {{"Login"}}},
-    {crow::HTTPMethod::HEAD, {{"Login"}}},
-    {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
-
-static OperationMap managerCollectionOpMap = {
-    {crow::HTTPMethod::GET, {{"Login"}}},
-    {crow::HTTPMethod::HEAD, {{"Login"}}},
-    {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
-
 class Manager : public Node {
  public:
-  Manager(CrowApp& app)
-      : Node(app, EntityPrivileges(std::move(managerOpMap)),
-             "/redfish/v1/Managers/openbmc/") {
+  Manager(CrowApp& app) : Node(app, "/redfish/v1/Managers/openbmc/") {
     Node::json["@odata.id"] = "/redfish/v1/Managers/openbmc";
     Node::json["@odata.type"] = "#Manager.v1_3_0.Manager";
     Node::json["@odata.context"] = "/redfish/v1/$metadata#Manager.Manager";
@@ -55,6 +37,13 @@
             .system_uuid;
     Node::json["Model"] = "OpenBmc";               // TODO(ed), get model
     Node::json["FirmwareVersion"] = "1234456789";  // TODO(ed), get fwversion
+
+    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
+                        {crow::HTTPMethod::HEAD, {{"Login"}}},
+                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
   }
 
  private:
@@ -84,9 +73,7 @@
 class ManagerCollection : public Node {
  public:
   ManagerCollection(CrowApp& app)
-      : Node(app, EntityPrivileges(std::move(managerCollectionOpMap)),
-             "/redfish/v1/Managers/"),
-        memberManager(app) {
+      : Node(app, "/redfish/v1/Managers/"), memberManager(app) {
     Node::json["@odata.id"] = "/redfish/v1/Managers";
     Node::json["@odata.type"] = "#ManagerCollection.ManagerCollection";
     Node::json["@odata.context"] =
@@ -94,6 +81,13 @@
     Node::json["Name"] = "Manager Collection";
     Node::json["Members@odata.count"] = 1;
     Node::json["Members"] = {{"@odata.id", "/redfish/v1/Managers/openbmc"}};
+
+    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
+                        {crow::HTTPMethod::HEAD, {{"Login"}}},
+                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
   }
 
  private:
diff --git a/redfish-core/lib/network_protocol.hpp b/redfish-core/lib/network_protocol.hpp
index 2b45b40..1410122 100644
--- a/redfish-core/lib/network_protocol.hpp
+++ b/redfish-core/lib/network_protocol.hpp
@@ -19,18 +19,10 @@
 
 namespace redfish {
 
-static OperationMap managerNetworkProtocolOpMap = {
-    {crow::HTTPMethod::GET, {{"Login"}}},
-    {crow::HTTPMethod::HEAD, {{"Login"}}},
-    {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
-
 class NetworkProtocol : public Node {
  public:
   NetworkProtocol(CrowApp& app)
-      : Node(app, EntityPrivileges(std::move(managerNetworkProtocolOpMap)),
+      : Node(app,
              "/redfish/v1/Managers/openbmc/NetworkProtocol") {
     Node::json["@odata.type"] =
         "#ManagerNetworkProtocol.v1_1_0.ManagerNetworkProtocol";
@@ -43,6 +35,13 @@
     Node::json["Status"]["Health"] = "OK";
     Node::json["Status"]["HealthRollup"] = "OK";
     Node::json["Status"]["State"] = "Enabled";
+
+    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
+                        {crow::HTTPMethod::HEAD, {{"Login"}}},
+                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
   }
 
  private:
diff --git a/redfish-core/lib/redfish_sessions.hpp b/redfish-core/lib/redfish_sessions.hpp
index 4225cc1..326d5e0 100644
--- a/redfish-core/lib/redfish_sessions.hpp
+++ b/redfish-core/lib/redfish_sessions.hpp
@@ -20,41 +20,23 @@
 
 namespace redfish {
 
-static OperationMap sessionOpMap = {
-    {crow::HTTPMethod::GET, {{"Login"}}},
-    {crow::HTTPMethod::HEAD, {{"Login"}}},
-    {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
-
-static OperationMap sessionCollectionOpMap = {
-    {crow::HTTPMethod::GET, {{"Login"}}},
-    {crow::HTTPMethod::HEAD, {{"Login"}}},
-    {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::POST, {{}}}};
-
-static OperationMap sessionServiceOpMap = {
-    {crow::HTTPMethod::GET, {{"Login"}}},
-    {crow::HTTPMethod::HEAD, {{"Login"}}},
-    {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
-
 class SessionCollection;
 
 class Sessions : public Node {
  public:
   Sessions(CrowApp& app)
-      : Node(app, EntityPrivileges(std::move(sessionOpMap)),
-             "/redfish/v1/SessionService/Sessions/<str>", std::string()) {
+      : Node(app, "/redfish/v1/SessionService/Sessions/<str>", std::string()) {
     Node::json["@odata.type"] = "#Session.v1_0_2.Session";
     Node::json["@odata.context"] = "/redfish/v1/$metadata#Session.Session";
     Node::json["Name"] = "User Session";
     Node::json["Description"] = "Manager User Session";
+
+    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
+                        {crow::HTTPMethod::HEAD, {{"Login"}}},
+                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
   }
 
  private:
@@ -112,9 +94,7 @@
 class SessionCollection : public Node {
  public:
   SessionCollection(CrowApp& app)
-      : Node(app, EntityPrivileges(std::move(sessionCollectionOpMap)),
-             "/redfish/v1/SessionService/Sessions/"),
-        memberSession(app) {
+      : Node(app, "/redfish/v1/SessionService/Sessions/"), memberSession(app) {
     Node::json["@odata.type"] = "#SessionCollection.SessionCollection";
     Node::json["@odata.id"] = "/redfish/v1/SessionService/Sessions/";
     Node::json["@odata.context"] =
@@ -123,6 +103,13 @@
     Node::json["Description"] = "Session Collection";
     Node::json["Members@odata.count"] = 0;
     Node::json["Members"] = nlohmann::json::array();
+
+    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
+                        {crow::HTTPMethod::HEAD, {{"Login"}}},
+                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::POST, {}}};
   }
 
  private:
@@ -243,9 +230,7 @@
 
 class SessionService : public Node {
  public:
-  SessionService(CrowApp& app)
-      : Node(app, EntityPrivileges(std::move(sessionServiceOpMap)),
-             "/redfish/v1/SessionService/") {
+  SessionService(CrowApp& app) : Node(app, "/redfish/v1/SessionService/") {
     Node::json["@odata.type"] = "#SessionService.v1_0_2.SessionService";
     Node::json["@odata.id"] = "/redfish/v1/SessionService/";
     Node::json["@odata.context"] =
@@ -258,6 +243,13 @@
     Node::json["Status"]["Health"] = "OK";
     Node::json["Status"]["HealthRollup"] = "OK";
     Node::json["ServiceEnabled"] = true;
+
+    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
+                        {crow::HTTPMethod::HEAD, {{"Login"}}},
+                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
   }
 
  private:
diff --git a/redfish-core/lib/roles.hpp b/redfish-core/lib/roles.hpp
index f1a1c61..fc804c2 100644
--- a/redfish-core/lib/roles.hpp
+++ b/redfish-core/lib/roles.hpp
@@ -19,27 +19,10 @@
 
 namespace redfish {
 
-static OperationMap roleOpMap = {
-    {crow::HTTPMethod::GET, {{"Login"}}},
-    {crow::HTTPMethod::HEAD, {{"Login"}}},
-    {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
-
-static OperationMap roleCollectionOpMap = {
-    {crow::HTTPMethod::GET, {{"Login"}}},
-    {crow::HTTPMethod::HEAD, {{"Login"}}},
-    {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
-    {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
-
 class Roles : public Node {
  public:
   Roles(CrowApp& app)
-      : Node(app, EntityPrivileges(std::move(roleOpMap)),
-             "/redfish/v1/AccountService/Roles/Administrator/") {
+      : Node(app, "/redfish/v1/AccountService/Roles/Administrator/") {
     Node::json["@odata.id"] = "/redfish/v1/AccountService/Roles/Administrator";
     Node::json["@odata.type"] = "#Role.v1_0_2.Role";
     Node::json["@odata.context"] = "/redfish/v1/$metadata#Role.Role";
@@ -51,6 +34,12 @@
                                         "ConfigureUsers", "ConfigureSelf",
                                         "ConfigureComponents"};
     Node::json["OemPrivileges"] = nlohmann::json::array();
+    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
+                        {crow::HTTPMethod::HEAD, {{"Login"}}},
+                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
   }
 
  private:
@@ -64,8 +53,7 @@
 class RoleCollection : public Node {
  public:
   RoleCollection(CrowApp& app)
-      : Node(app, EntityPrivileges(std::move(roleCollectionOpMap)),
-             "/redfish/v1/AccountService/Roles/") {
+      : Node(app, "/redfish/v1/AccountService/Roles/") {
     Node::json["@odata.id"] = "/redfish/v1/AccountService/Roles";
     Node::json["@odata.type"] = "#RoleCollection.RoleCollection";
     Node::json["@odata.context"] =
@@ -75,6 +63,13 @@
     Node::json["Members@odata.count"] = 1;
     Node::json["Members"] = {
         {"@odata.id", "/redfish/v1/AccountService/Roles/Administrator"}};
+
+    entityPrivileges = {{crow::HTTPMethod::GET, {{"Login"}}},
+                        {crow::HTTPMethod::HEAD, {{"Login"}}},
+                        {crow::HTTPMethod::PATCH, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::PUT, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::DELETE, {{"ConfigureManager"}}},
+                        {crow::HTTPMethod::POST, {{"ConfigureManager"}}}};
   }
 
  private:
diff --git a/redfish-core/lib/service_root.hpp b/redfish-core/lib/service_root.hpp
index 0afc0a2..c57d3e7 100644
--- a/redfish-core/lib/service_root.hpp
+++ b/redfish-core/lib/service_root.hpp
@@ -19,19 +19,9 @@
 
 namespace redfish {
 
-static OperationMap serviceRootOpMap = {
-    {crow::HTTPMethod::GET, {{}}},
-    {crow::HTTPMethod::HEAD, {{}}},
-    {crow::HTTPMethod::PATCH, {{"ConfigureComponents"}}},
-    {crow::HTTPMethod::PUT, {{"ConfigureComponents"}}},
-    {crow::HTTPMethod::DELETE, {{"ConfigureComponents"}}},
-    {crow::HTTPMethod::POST, {{"ConfigureComponents"}}}};
-
 class ServiceRoot : public Node {
  public:
-  ServiceRoot(CrowApp& app)
-      : Node(app, EntityPrivileges(std::move(serviceRootOpMap)),
-             "/redfish/v1/") {
+  ServiceRoot(CrowApp& app) : Node(app, "/redfish/v1/") {
     Node::json["@odata.type"] = "#ServiceRoot.v1_1_1.ServiceRoot";
     Node::json["@odata.id"] = "/redfish/v1/";
     Node::json["@odata.context"] =
@@ -44,6 +34,13 @@
     Node::json["UUID"] =
         app.template get_middleware<crow::PersistentData::Middleware>()
             .system_uuid;
+
+    entityPrivileges = {{crow::HTTPMethod::GET, {}},
+                        {crow::HTTPMethod::HEAD, {}},
+                        {crow::HTTPMethod::PATCH, {{"ConfigureComponents"}}},
+                        {crow::HTTPMethod::PUT, {{"ConfigureComponents"}}},
+                        {crow::HTTPMethod::DELETE, {{"ConfigureComponents"}}},
+                        {crow::HTTPMethod::POST, {{"ConfigureComponents"}}}};
   }
 
  private: