Skip to content

Commit 597b022

Browse files
liuh-80liuh-80azureuser
authored
Add SonicDBConfig.getInstanceList() API (sonic-net#639)
#### Why I did it SonicDBConfig.getInstanceList() API is missing in swsscommon. The py-swsssdk library are going to be deprercated, to change all script to use swsscommon, we need add this missing API. #### How I did it Add SonicDBConfig.getInstanceList() API. #### How to verify it Pass all existed test case Add new test case to cover new API. #### Which release branch to backport (provide reason below if selected) <!-- - Note we only backport fixes to a release branch, *not* features! - Please also provide a reason for the backporting below. - e.g. - [x] 202006 --> - [ ] 201811 - [ ] 201911 - [ ] 202006 - [ ] 202012 - [ ] 202106 - [ ] 202111 - [ ] 202205 #### Description for the changelog Add SonicDBConfig.getInstanceList() API. #### Link to config_db schema for YANG module changes #### A picture of a cute animal (not mandatory but encouraged) Co-authored-by: liuh-80 <azureuser@liuh-dev-vm-02.5fg3zjdzj2xezlx1yazx5oxkzd.hx.internal.cloudapp.net> Co-authored-by: azureuser <[email protected]>
1 parent c30c34f commit 597b022

File tree

5 files changed

+41
-19
lines changed

5 files changed

+41
-19
lines changed

common/dbconnector.cpp

100644100755
Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ using namespace std;
1818
using namespace swss;
1919

2020
void SonicDBConfig::parseDatabaseConfig(const string &file,
21-
std::unordered_map<std::string, RedisInstInfo> &inst_entry,
21+
std::map<std::string, RedisInstInfo> &inst_entry,
2222
std::unordered_map<std::string, SonicDBInfo> &db_entry,
2323
std::unordered_map<int, std::string> &separator_entry)
2424
{
@@ -72,7 +72,7 @@ void SonicDBConfig::initializeGlobalConfig(const string &file)
7272
{
7373
std::string local_file, dir_name, ns_name;
7474
std::unordered_map<std::string, SonicDBInfo> db_entry;
75-
std::unordered_map<std::string, RedisInstInfo> inst_entry;
75+
std::map<std::string, RedisInstInfo> inst_entry;
7676
std::unordered_map<int, std::string> separator_entry;
7777
std::lock_guard<std::recursive_mutex> guard(m_db_info_mutex);
7878

@@ -164,7 +164,7 @@ void SonicDBConfig::initializeGlobalConfig(const string &file)
164164
void SonicDBConfig::initialize(const string &file)
165165
{
166166
std::unordered_map<std::string, SonicDBInfo> db_entry;
167-
std::unordered_map<std::string, RedisInstInfo> inst_entry;
167+
std::map<std::string, RedisInstInfo> inst_entry;
168168
std::unordered_map<int, std::string> separator_entry;
169169
std::lock_guard<std::recursive_mutex> guard(m_db_info_mutex);
170170

@@ -201,7 +201,7 @@ void SonicDBConfig::validateNamespace(const string &netns)
201201
}
202202

203203
// Check if the namespace is valid, check if this is a key in either of this map
204-
unordered_map<string, unordered_map<string, RedisInstInfo>>::const_iterator entry = m_inst_info.find(netns);
204+
unordered_map<string, map<string, RedisInstInfo>>::const_iterator entry = m_inst_info.find(netns);
205205
if (entry == m_inst_info.end())
206206
{
207207
SWSS_LOG_THROW("Namespace %s is not a valid namespace name in config file", netns.c_str());
@@ -391,10 +391,27 @@ std::vector<std::string> SonicDBConfig::getDbList(const std::string &netns)
391391
return dbNames;
392392
}
393393

394+
map<string, RedisInstInfo> SonicDBConfig::getInstanceList(const std::string &netns)
395+
{
396+
if (!m_init)
397+
{
398+
initialize();
399+
}
400+
validateNamespace(netns);
401+
402+
map<string, RedisInstInfo> result;
403+
auto iterator = m_inst_info.find(netns);
404+
if (iterator != m_inst_info.end()) {
405+
return iterator->second;
406+
}
407+
408+
return map<string, RedisInstInfo>();
409+
}
410+
394411
constexpr const char *SonicDBConfig::DEFAULT_SONIC_DB_CONFIG_FILE;
395412
constexpr const char *SonicDBConfig::DEFAULT_SONIC_DB_GLOBAL_CONFIG_FILE;
396413
std::recursive_mutex SonicDBConfig::m_db_info_mutex;
397-
unordered_map<string, unordered_map<string, RedisInstInfo>> SonicDBConfig::m_inst_info;
414+
unordered_map<string, map<string, RedisInstInfo>> SonicDBConfig::m_inst_info;
398415
unordered_map<string, unordered_map<string, SonicDBInfo>> SonicDBConfig::m_db_info;
399416
unordered_map<string, unordered_map<int, string>> SonicDBConfig::m_db_separator;
400417
bool SonicDBConfig::m_init = false;

common/dbconnector.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
#ifndef __DBCONNECTOR__
1+
#ifndef __DBCONNECTOR__
22
#define __DBCONNECTOR__
33

44
#include <string>
55
#include <vector>
66
#include <unordered_map>
77
#include <utility>
8+
#include <map>
89
#include <memory>
910
#include <mutex>
1011

@@ -81,19 +82,20 @@ class SonicDBConfig
8182
static std::vector<std::string> getDbList(const std::string &netns = EMPTY_NAMESPACE);
8283
static bool isInit() { return m_init; };
8384
static bool isGlobalInit() { return m_global_init; };
85+
static std::map<std::string, RedisInstInfo> getInstanceList(const std::string &netns = EMPTY_NAMESPACE);
8486

8587
private:
8688
static std::recursive_mutex m_db_info_mutex;
8789
// { namespace { instName, { unix_socket_path, hostname, port } } }
88-
static std::unordered_map<std::string, std::unordered_map<std::string, RedisInstInfo>> m_inst_info;
90+
static std::unordered_map<std::string, std::map<std::string, RedisInstInfo>> m_inst_info;
8991
// { namespace, { dbName, {instName, dbId, separator} } }
9092
static std::unordered_map<std::string, std::unordered_map<std::string, SonicDBInfo>> m_db_info;
9193
// { namespace, { dbId, separator } }
9294
static std::unordered_map<std::string, std::unordered_map<int, std::string>> m_db_separator;
9395
static bool m_init;
9496
static bool m_global_init;
9597
static void parseDatabaseConfig(const std::string &file,
96-
std::unordered_map<std::string, RedisInstInfo> &inst_entry,
98+
std::map<std::string, RedisInstInfo> &inst_entry,
9799
std::unordered_map<std::string, SonicDBInfo> &db_entry,
98100
std::unordered_map<int, std::string> &separator_entry);
99101
static SonicDBInfo& getDbInfo(const std::string &dbName, const std::string &netns = EMPTY_NAMESPACE);

pyext/swsscommon.i

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,13 @@
5050

5151
%template(FieldValuePair) std::pair<std::string, std::string>;
5252
%template(FieldValuePairs) std::vector<std::pair<std::string, std::string>>;
53+
%template(FieldValuePairsList) std::vector<std::vector<std::pair<std::string, std::string>>>;
5354
%template(FieldValueMap) std::map<std::string, std::string>;
5455
%template(VectorString) std::vector<std::string>;
5556
%template(ScanResult) std::pair<int64_t, std::vector<std::string>>;
5657
%template(GetTableResult) std::map<std::string, std::map<std::string, std::string>>;
5758
%template(GetConfigResult) std::map<std::string, std::map<std::string, std::map<std::string, std::string>>>;
59+
%template(GetInstanceListResult) std::map<std::string, swss::RedisInstInfo>;
5860

5961
%exception {
6062
try
@@ -82,15 +84,6 @@
8284
}
8385
}
8486

85-
%template(FieldValuePair) std::pair<std::string, std::string>;
86-
%template(FieldValuePairs) std::vector<std::pair<std::string, std::string>>;
87-
%template(FieldValuePairsList) std::vector<std::vector<std::pair<std::string, std::string>>>;
88-
%template(FieldValueMap) std::map<std::string, std::string>;
89-
%template(VectorString) std::vector<std::string>;
90-
%template(ScanResult) std::pair<int64_t, std::vector<std::string>>;
91-
%template(GetTableResult) std::map<std::string, std::map<std::string, std::string>>;
92-
%template(GetConfigResult) std::map<std::string, std::map<std::string, std::map<std::string, std::string>>>;
93-
9487
%typemap(out) std::shared_ptr<std::string> %{
9588
{
9689
auto& p = static_cast<std::shared_ptr<std::string>&>($1);

tests/redis_multi_ns_ut.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#include <iostream>
22
#include <fstream>
3+
#include <map>
34
#include "gtest/gtest.h"
45
#include "common/dbconnector.h"
56
#include "common/json.hpp"
67
#include "common/table.h"
7-
#include <unordered_map>
88

99
using namespace std;
1010
using namespace swss;
@@ -77,7 +77,7 @@ TEST(DBConnector, multi_ns_test)
7777
{
7878
json j;
7979
i >> j;
80-
unordered_map<string, RedisInstInfo> m_inst_info;
80+
map<string, RedisInstInfo> m_inst_info;
8181
for (auto it = j["INSTANCES"].begin(); it!= j["INSTANCES"].end(); it++)
8282
{
8383
string instName = it.key();

tests/test_redis_ut.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,3 +677,13 @@ def test_DBConnectFailure():
677677
with pytest.raises(RuntimeError):
678678
db = swsscommon.DBConnector(0, nonexisting_host, 0)
679679

680+
def test_SonicDBConfigGetInstanceList():
681+
""" Verify that SonicDBConfig.getInstanceList will return correct redis instance information """
682+
683+
instanceList = swsscommon.SonicDBConfig.getInstanceList()
684+
keys = instanceList.keys()
685+
686+
assert keys[0] == 'redis'
687+
assert instanceList['redis'].unixSocketPath == '/var/run/redis/redis.sock'
688+
assert instanceList['redis'].hostname == '127.0.0.1'
689+
assert instanceList['redis'].port == 6379

0 commit comments

Comments
 (0)