Multiple DBAAS Redis Sentinel groups
[ric-plt/sdl.git] / src / redis / asyncdatabasediscovery.cpp
index 892e7cc..8723def 100644 (file)
    limitations under the License.
 */
 
-#include "private/redis/asyncdatabasediscovery.hpp"
-#include "private/databaseconfiguration.hpp"
-#include "private/logger.hpp"
+/*
+ * This source code is part of the near-RT RIC (RAN Intelligent Controller)
+ * platform project (RICP).
+*/
+
 #include <cstdlib>
 #include "config.h"
+#include "private/abort.hpp"
+#include "private/databaseconfiguration.hpp"
+#include "private/logger.hpp"
+#include "private/redis/asyncdatabasediscovery.hpp"
 #if HAVE_HIREDIS
 #include "private/redis/asynchiredisdatabasediscovery.hpp"
 #endif
-#include "private/abort.hpp"
+#include "private/redis/asyncsentineldatabasediscovery.hpp"
 
 using namespace shareddatalayer::redis;
 
 std::shared_ptr<AsyncDatabaseDiscovery> AsyncDatabaseDiscovery::create(std::shared_ptr<Engine> engine,
                                                                        const boost::optional<Namespace>& ns,
                                                                        const DatabaseConfiguration& staticDatabaseConfiguration,
+                                                                       const boost::optional<std::size_t>& addressIndex,
                                                                        std::shared_ptr<Logger> logger)
 {
     auto staticAddresses(staticDatabaseConfiguration.getServerAddresses());
@@ -49,15 +56,31 @@ std::shared_ptr<AsyncDatabaseDiscovery> AsyncDatabaseDiscovery::create(std::shar
         SHAREDDATALAYER_ABORT("No Hiredis vip for Redis cluster configuration");
 #endif
     else
+    {
 #if HAVE_HIREDIS
-        return std::make_shared<AsyncHiredisDatabaseDiscovery>(engine,
-                                                               ns,
-                                                               DatabaseInfo::Type::SINGLE,
-                                                               staticAddresses,
-                                                               logger);
+        if (staticDbType == DatabaseConfiguration::DbType::REDIS_SENTINEL ||
+            staticDbType == DatabaseConfiguration::DbType::SDL_CLUSTER)
+        {
+            auto sentinelAddress(staticDatabaseConfiguration.getSentinelAddress(addressIndex));
+            if (sentinelAddress)
+                return std::make_shared<AsyncSentinelDatabaseDiscovery>(engine,
+                                                                        logger,
+                                                                        *sentinelAddress,
+                                                                        staticDatabaseConfiguration.getSentinelMasterName());
+            else
+                SHAREDDATALAYER_ABORT("Sentinel address not configured.");
+        }
+        else
+        {
+            return std::make_shared<AsyncHiredisDatabaseDiscovery>(engine,
+                                                                   ns,
+                                                                   DatabaseInfo::Type::SINGLE,
+                                                                   staticAddresses,
+                                                                   logger);
+        }
 #else
         static_cast<void>(logger);
         SHAREDDATALAYER_ABORT("No Hiredis");
 #endif
+    }
 }
-