X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fconfigurationreader.cpp;h=2cd707b4301e93f0df2d397fcb504611c10e5026;hb=5bdca62d89d430f607310370fe1391bd1d1bd21a;hp=cc5e33e2c1fe8adece7f8986d0f05d830c96570e;hpb=a0745d294dcd72f7d78ea4c3accd3b477dd668a5;p=ric-plt%2Fsdl.git diff --git a/src/configurationreader.cpp b/src/configurationreader.cpp index cc5e33e..2cd707b 100644 --- a/src/configurationreader.cpp +++ b/src/configurationreader.cpp @@ -1,5 +1,5 @@ /* - Copyright (c) 2018-2019 Nokia. + Copyright (c) 2018-2022 Nokia. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ #include "private/namespaceconfigurations.hpp" #include "private/namespacevalidator.hpp" #include "private/system.hpp" +#include using namespace shareddatalayer; @@ -195,6 +196,27 @@ namespace for (const auto &namespaceConfigurationMapItem : namespaceConfigurationMap ) parseNsConfiguration(namespaceConfigurations, namespaceConfigurationMapItem.first, namespaceConfigurationMapItem.second.first, namespaceConfigurationMapItem.second.second); } + + const std::string DEFAULT_REDIS_PORT("6379"); + + void appendDBPortToAddrList(std::string& addresses, const std::string& port) + { + size_t base(0); + std::vector portList; + boost::split(portList, port, boost::is_any_of(",")); + + std::size_t idx(0); + auto redisPort((portList.size() > 0 && idx < portList.size()) ? portList.at(idx) : DEFAULT_REDIS_PORT); + auto pos = addresses.find(',', base); + while (std::string::npos != pos) + { + addresses.insert(pos, ":" + redisPort); + base = pos + 2 + redisPort.size(); + pos = addresses.find(',', base); + idx++; + } + addresses.append(":" + redisPort); + } } ConfigurationReader::ConfigurationReader(std::shared_ptr logger): @@ -213,6 +235,8 @@ ConfigurationReader::ConfigurationReader(const Directories& directories, sentinelPortEnvVariableValue({}), sentinelMasterNameEnvVariableName(SENTINEL_MASTER_NAME_ENV_VAR_NAME), sentinelMasterNameEnvVariableValue({}), + dbClusterAddrListEnvVariableName(DB_CLUSTER_ADDR_LIST_ENV_VAR_NAME), + dbClusterAddrListEnvVariableValue({}), jsonDatabaseConfiguration(boost::none), logger(logger) { @@ -230,6 +254,9 @@ ConfigurationReader::ConfigurationReader(const Directories& directories, envStr = system.getenv(sentinelMasterNameEnvVariableName.c_str()); if (envStr) sentinelMasterNameEnvVariableValue = envStr; + envStr = system.getenv(dbClusterAddrListEnvVariableName.c_str()); + if (envStr) + dbClusterAddrListEnvVariableValue = envStr; } readConfigurationFromDirectories(directories); @@ -301,19 +328,46 @@ void ConfigurationReader::readDatabaseConfiguration(DatabaseConfiguration& datab if (sourceForDatabaseConfiguration == dbHostEnvVariableName) { // NOTE: Redis cluster is not currently configurable via environment variables. - if (sentinelPortEnvVariableValue.empty()) + std::string dbHostAddrs; + if (!dbHostEnvVariableValue.empty() && sentinelPortEnvVariableValue.empty() && dbClusterAddrListEnvVariableValue.empty()) { validateAndSetDbType("redis-standalone", databaseConfiguration, sourceForDatabaseConfiguration); - if (dbPortEnvVariableValue.empty()) - parseDatabaseServersConfigurationFromString(databaseConfiguration, dbHostEnvVariableValue, sourceForDatabaseConfiguration); - else - parseDatabaseServersConfigurationFromString(databaseConfiguration, dbHostEnvVariableValue + ":" + dbPortEnvVariableValue, sourceForDatabaseConfiguration); + dbHostAddrs = dbHostEnvVariableValue; } - else + else if (!dbHostEnvVariableValue.empty() && !sentinelPortEnvVariableValue.empty() && dbClusterAddrListEnvVariableValue.empty()) { validateAndSetDbType("redis-sentinel", databaseConfiguration, sourceForDatabaseConfiguration); - databaseConfiguration.checkAndApplySentinelAddress(dbHostEnvVariableValue + ":" + sentinelPortEnvVariableValue); - databaseConfiguration.checkAndApplySentinelMasterName(sentinelMasterNameEnvVariableValue); + dbHostAddrs = dbHostEnvVariableValue; + } + else if (sentinelPortEnvVariableValue.empty() && !dbClusterAddrListEnvVariableValue.empty()) + { + validateAndSetDbType("sdl-standalone-cluster", databaseConfiguration, sourceForDatabaseConfiguration); + dbHostAddrs = dbClusterAddrListEnvVariableValue; + } + else if (!sentinelPortEnvVariableValue.empty() && !dbClusterAddrListEnvVariableValue.empty()) + { + validateAndSetDbType("sdl-sentinel-cluster", databaseConfiguration, sourceForDatabaseConfiguration); + dbHostAddrs = dbClusterAddrListEnvVariableValue; + } + else + { + std::ostringstream os; + os << "Configuration error in " << sourceForDatabaseConfiguration << ": " + << "Missing environment variable configuration!"; + throw Exception(os.str()); + } + + if (!dbPortEnvVariableValue.empty()) + appendDBPortToAddrList(dbHostAddrs, dbPortEnvVariableValue); + parseDatabaseServersConfigurationFromString(databaseConfiguration, + dbHostAddrs, + sourceForDatabaseConfiguration); + auto dbType = databaseConfiguration.getDbType(); + if (DatabaseConfiguration::DbType::REDIS_SENTINEL == dbType || + DatabaseConfiguration::DbType::SDL_SENTINEL_CLUSTER == dbType) + { + databaseConfiguration.checkAndApplySentinelPorts(sentinelPortEnvVariableValue); + databaseConfiguration.checkAndApplySentinelMasterNames(sentinelMasterNameEnvVariableValue); } } else