-
Notifications
You must be signed in to change notification settings - Fork 120
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Namespace] Fix interfaces counters in InterfacesMIB RFC 2863 #141
Changes from 8 commits
815fc67
216ef86
7baa245
964a353
f8c6ade
6772fa1
14353e2
5f49791
4ed96fd
b91863b
ff5d7b8
5a54bdb
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -160,6 +160,31 @@ def mgmt_if_entry_table_state_db(if_name): | |
|
||
return b'MGMT_PORT_TABLE|' + if_name | ||
|
||
def get_sai_id_key(namespace, sai_id): | ||
""" | ||
inputs: | ||
namespace - string | ||
sai id - bytes | ||
Return type: | ||
bytes | ||
Return value: namespace:sai id or sai id | ||
""" | ||
if namespace != '': | ||
sai_id_key = namespace + ':' + sai_id.decode() | ||
return sai_id_key.encode() | ||
else: | ||
return sai_id | ||
|
||
def split_sai_id_key(sai_id_key): | ||
""" | ||
Input - bytes | ||
Return namespace string and sai id in byte string. | ||
""" | ||
if b':' in sai_id_key: | ||
namespace, sai_id = sai_id_key.split(b':') | ||
return namespace.decode(), sai_id | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. you can split first and check result len(). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated as per comment. |
||
else: | ||
return '', sai_id | ||
|
||
def config(**kwargs): | ||
global redis_kwargs | ||
|
@@ -221,7 +246,11 @@ def init_sync_d_interface_tables(db_conn): | |
if_name_map = {if_name: sai_id for if_name, sai_id in if_name_map.items() if \ | ||
(re.match(port_util.SONIC_ETHERNET_RE_PATTERN, if_name.decode()) or \ | ||
re.match(port_util.SONIC_ETHERNET_BP_RE_PATTERN, if_name.decode()))} | ||
if_id_map = {sai_id: if_name for sai_id, if_name in if_id_map.items() if \ | ||
# As sai_id is not unique in multi-asic platform, concatenate it with | ||
# namespace to get a unique key. Assuming that ':' is not present in namespace | ||
# string or in sai id. | ||
# sai_id_key = namespace : sai_id | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
This is a new assumption that ':' will not appear in name space or sai_id. Please add code comment. #Closed There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. How about using '|' which is widely used in Redis keys In reply to: 453139692 [](ancestors = 453139692) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added comment. |
||
if_id_map = {get_sai_id_key(db_conn.namespace, sai_id): if_name for sai_id, if_name in if_id_map.items() if \ | ||
(re.match(port_util.SONIC_ETHERNET_RE_PATTERN, if_name.decode()) or \ | ||
re.match(port_util.SONIC_ETHERNET_BP_RE_PATTERN, if_name.decode()))} | ||
logger.debug("Port name map:\n" + pprint.pformat(if_name_map, indent=2)) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,6 +4,7 @@ | |
from sonic_ax_impl import mibs | ||
from ax_interface.mib import MIBMeta, MIBUpdater, ValueType, SubtreeMIBEntry, OverlayAdpaterMIBEntry, OidMIBEntry | ||
from sonic_ax_impl.mibs import Namespace | ||
from swsssdk.port_util import get_index_from_str | ||
|
||
@unique | ||
class DbTables32(int, Enum): | ||
|
@@ -98,10 +99,12 @@ def update_data(self): | |
Update redis (caches config) | ||
Pulls the table references for each interface. | ||
""" | ||
self.if_counters = { | ||
sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) | ||
for sai_id in self.if_id_map} | ||
|
||
for sai_id_key in self.if_id_map: | ||
namespace, sai_id = mibs.split_sai_id_key(sai_id_key) | ||
if_idx = get_index_from_str(self.if_id_map[sai_id_key].decode()) | ||
for db in self.db_conn: | ||
if db.namespace == namespace: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is not efficient, because you search Propose 2 alternative solutions:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added a map, db_index cannot be obtained directly in this function and will have to be passed as an additional argument. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @qiluo-msft thanks for pointing out. |
||
self.if_counters[if_idx] = db.get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
break after this line? #Closed |
||
|
||
def get_next(self, sub_id): | ||
""" | ||
|
@@ -186,11 +189,10 @@ def _get_counter(self, oid, table_name, mask): | |
|
||
return counter_value & mask | ||
|
||
sai_id = self.oid_sai_map[oid] | ||
# Enum.name or table_name = 'name_of_the_table' | ||
_table_name = bytes(getattr(table_name, 'name', table_name), 'utf-8') | ||
try: | ||
counter_value = self.if_counters[sai_id][_table_name] | ||
counter_value = self.if_counters[oid][_table_name] | ||
# truncate to 32-bit counter (database implements 64-bit counters) | ||
counter_value = int(counter_value) & mask | ||
# done! | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,6 +23,7 @@ | |
class TestSonicMIB(TestCase): | ||
@classmethod | ||
def setUpClass(cls): | ||
cls.skipTest(cls, "Namespace not implemented") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
What is the meaning of "Namespace not implemented"? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For multi-asic platform, the change is made to if_id_map key to store namespace and sai id together. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @SuvarnaMeenakshi better we should add similar comment in test case itself as TODO so that is easy to understand and track There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated comment with TODO |
||
tests.mock_tables.dbconnector.load_namespace_config() | ||
importlib.reload(rfc4363) | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
return namespace.encode() + b':' + sai_id
This will be easier and shorter. #Closed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
updated as per comment.