Skip to content

Commit c92ac45

Browse files
authored
Merge pull request #32 from Azure/python2to3
[sonic-dbsyncd] Changes to convert sonic-dbsyncd from python 2 to 3
2 parents 95824a9 + da524f7 commit c92ac45

6 files changed

Lines changed: 56 additions & 23 deletions

File tree

setup.cfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[aliases]
2+
test=pytest

setup.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22

33
dependencies = [
44
'swsssdk>=1.3.0',
5-
'enum34>=1.1.6',
65
]
76

87
test_deps = [
9-
'mockredispy>=2.9.3',
8+
'pytest',
9+
'mock>=2.0.0',
10+
'mockredispy>=2.9.3'
1011
]
1112

1213
high_performance_deps = [
@@ -17,9 +18,9 @@
1718
name='sonic-d',
1819
install_requires=dependencies,
1920
version='2.0.0',
21+
tests_require=test_deps,
2022
packages=find_packages('src'),
2123
extras_require={
22-
'testing': test_deps,
2324
'high_perf': high_performance_deps,
2425
},
2526
license='Apache 2.0',
@@ -31,10 +32,13 @@
3132
'sonic_syncd': 'src/sonic_syncd',
3233
'lldp_syncd': 'src/lldp_syncd',
3334
},
34-
classifiers=[
35+
setup_requires= [
36+
'pytest-runner',
37+
'wheel',
38+
],
39+
classifiers = [
3540
'Intended Audience :: Developers',
3641
'Operating System :: Linux',
37-
'Programming Language :: Python',
38-
'Programming Language :: Python :: 2.7',
42+
'Programming Language :: Python :: 3.7',
3943
],
4044
)

src/lldp_syncd/daemon.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def get_sys_capability_list(self, if_attributes, if_name, chassis_id):
124124
if 'capability' in if_attributes['chassis']:
125125
capability_list = if_attributes['chassis']['capability']
126126
else:
127-
capability_list = if_attributes['chassis'].values()[0]['capability']
127+
capability_list = list(if_attributes['chassis'].values())[0]['capability']
128128
# {'enabled': ..., 'type': 'capability'}
129129
if isinstance(capability_list, dict):
130130
capability_list = [capability_list]
@@ -233,7 +233,7 @@ def parse_update(self, lldp_json):
233233
rem_port_keys = ('lldp_rem_port_id_subtype',
234234
'lldp_rem_port_id',
235235
'lldp_rem_port_desc')
236-
parsed_port = zip(rem_port_keys, self.parse_port(if_attributes['port']))
236+
parsed_port = list(zip(rem_port_keys, self.parse_port(if_attributes['port'])))
237237
parsed_interfaces[if_name].update(parsed_port)
238238

239239
chassis_id = ''
@@ -244,8 +244,8 @@ def parse_update(self, lldp_json):
244244
'lldp_rem_sys_name',
245245
'lldp_rem_sys_desc',
246246
'lldp_rem_man_addr')
247-
parsed_chassis = zip(rem_chassis_keys,
248-
self.parse_chassis(if_attributes['chassis']))
247+
parsed_chassis = list(zip(rem_chassis_keys,
248+
self.parse_chassis(if_attributes['chassis'])))
249249
parsed_interfaces[if_name].update(parsed_chassis)
250250
chassis_id = parsed_chassis[1][1]
251251

@@ -296,7 +296,7 @@ def parse_chassis(self, chassis_attributes):
296296
attributes = chassis_attributes
297297
id_attributes = chassis_attributes['id']
298298
else:
299-
(sys_name, attributes) = chassis_attributes.items()[0]
299+
(sys_name, attributes) = list(chassis_attributes.items())[0]
300300
id_attributes = attributes.get('id', '')
301301

302302
chassis_id_subtype = str(self.ChassisIdSubtypeMap[id_attributes['type']].value)
@@ -352,7 +352,7 @@ def sync(self, parsed_update):
352352
logger.debug("Initiating LLDPd sync to Redis...")
353353

354354
# push local chassis data to APP DB
355-
if parsed_update.has_key('local-chassis'):
355+
if 'local-chassis' in parsed_update:
356356
chassis_update = parsed_update.pop('local-chassis')
357357
if chassis_update != self.chassis_cache:
358358
self.db_connector.delete(self.db_connector.APPL_DB,

tests/mock_tables/dbconnector.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
11
# MONKEY PATCH!!!
22
import json
33
import os
4+
import sys
45

56
import mockredis
67
import swsssdk.interface
78
from swsssdk.interface import redis
9+
from swsssdk import SonicV2Connector
10+
11+
if sys.version_info >= (3, 0):
12+
long = int
13+
xrange = range
14+
basestring = str
15+
16+
_old_connect_SonicV2Connector = SonicV2Connector.connect
17+
18+
def connect_SonicV2Connector(self, db_name, retry_on=True):
19+
self.dbintf.redis_kwargs['db_name'] = db_name
20+
self.dbintf.redis_kwargs['decode_responses'] = True
21+
_old_connect_SonicV2Connector(self, db_name, retry_on)
822

923

1024
def _subscribe_keyspace_notification(self, db_name, client):
@@ -38,6 +52,7 @@ class SwssSyncClient(mockredis.MockRedis):
3852
def __init__(self, *args, **kwargs):
3953
super(SwssSyncClient, self).__init__(strict=True, *args, **kwargs)
4054
db = kwargs.pop('db')
55+
self.decode_responses = kwargs.pop('decode_responses', False) == True
4156

4257
self.pubsub = MockPubSub()
4358

@@ -55,6 +70,17 @@ def __init__(self, *args, **kwargs):
5570
for k, v in table.items():
5671
self.hset(h, k, v)
5772

73+
# Patch mockredis/mockredis/client.py
74+
# The offical implementation assume decode_responses=False
75+
# Here we detect the option and decode after doing encode
76+
def _encode(self, value):
77+
"Return a bytestring representation of the value. Taken from redis-py connection.py"
78+
79+
value = super(SwssSyncClient, self)._encode(value)
80+
81+
if self.decode_responses:
82+
return value.decode('utf-8')
83+
5884
# Patch mockredis/mockredis/client.py
5985
# The official implementation will filter out keys with a slash '/'
6086
# ref: https://github.com/locationlabs/mockredis/blob/master/mockredis/client.py
@@ -76,9 +102,10 @@ def keys(self, pattern='*'):
76102
regex = re.compile(regex)
77103

78104
# Find every key that matches the pattern
79-
return [key for key in self.redis.keys() if regex.match(key.decode('utf-8'))]
105+
return [key for key in self.redis.keys() if regex.match(key)]
80106

81107

82108
swsssdk.interface.DBInterface._subscribe_keyspace_notification = _subscribe_keyspace_notification
83109
mockredis.MockRedis.config_set = config_set
84110
redis.StrictRedis = SwssSyncClient
111+
SonicV2Connector.connect = connect_SonicV2Connector

tests/subproc_outputs/lldpctl.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@
136136
"type": "ifname",
137137
"value": "Ethernet1"
138138
},
139+
"descr": "this is a port description",
139140
"mfs": "9236"
140141
},
141142
"via": "LLDP",

tests/test_lldpSyncDaemon.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,11 @@ def test_sync_roundtrip(self):
7979
print(json.dumps(dump, indent=3))
8080

8181
# convert dict keys to ints for easy comparison
82-
jo = {int(re.findall(r'\d+', k)[0]): v for k, v in parsed_update.items()}
83-
r_out = {int(re.findall(r'\d+', k)[0]): v for k, v in dump.items()}
84-
self.assertEqual(jo, r_out)
82+
jo = {'LLDP_ENTRY_TABLE:'+ k: v for k, v in parsed_update.items()}
83+
self.assertEqual(jo, dump)
8584

8685
# test enumerations
87-
for k, v in r_out.items():
86+
for k, v in dump.items():
8887
chassis_subtype = v['lldp_rem_chassis_id_subtype']
8988
chassis_id = v['lldp_rem_chassis_id']
9089
if int(chassis_subtype) == lldp_syncd.conventions.LldpChassisIdSubtype.macAddress:
@@ -94,22 +93,22 @@ def test_sync_roundtrip(self):
9493
self.fail("Test data only contains chassis MACs")
9594

9695
def test_timeparse(self):
97-
self.assertEquals(lldp_syncd.daemon.parse_time("0 day, 05:09:02"), make_seconds(0, 5, 9, 2))
98-
self.assertEquals(lldp_syncd.daemon.parse_time("2 days, 05:59:02"), make_seconds(2, 5, 59, 2))
96+
self.assertEqual(lldp_syncd.daemon.parse_time("0 day, 05:09:02"), make_seconds(0, 5, 9, 2))
97+
self.assertEqual(lldp_syncd.daemon.parse_time("2 days, 05:59:02"), make_seconds(2, 5, 59, 2))
9998

10099
def parse_mgmt_ip(self, json_file):
101100
parsed_update = self.daemon.parse_update(json_file)
102101
mgmt_ip_str = parsed_update['local-chassis'].get('lldp_loc_man_addr')
103102
json_chassis = json.dumps(json_file['lldp_loc_chassis']['local-chassis']['chassis'])
104103
chassis_dict = json.loads(json_chassis)
105-
json_mgmt_ip = chassis_dict.values()[0]['mgmt-ip']
104+
json_mgmt_ip = list(chassis_dict.values())[0]['mgmt-ip']
106105
if isinstance(json_mgmt_ip, list):
107106
i=0
108107
for mgmt_ip in mgmt_ip_str.split(','):
109-
self.assertEquals(mgmt_ip, json_mgmt_ip[i])
108+
self.assertEqual(mgmt_ip, json_mgmt_ip[i])
110109
i+=1
111110
else:
112-
self.assertEquals(mgmt_ip_str, json_mgmt_ip)
111+
self.assertEqual(mgmt_ip_str, json_mgmt_ip)
113112

114113
def test_multiple_mgmt_ip(self):
115114
self.parse_mgmt_ip(self._json)
@@ -123,7 +122,7 @@ def test_loc_chassis(self):
123122
self.daemon.sync(parsed_update)
124123
db = create_dbconnector()
125124
db_loc_chassis_data = db.get_all(db.APPL_DB, 'LLDP_LOC_CHASSIS')
126-
self.assertEquals(parsed_loc_chassis, db_loc_chassis_data)
125+
self.assertEqual(parsed_loc_chassis, db_loc_chassis_data)
127126

128127
def test_remote_sys_capability_list(self):
129128
interface_list = self._interface_only['lldp'].get('interface')

0 commit comments

Comments
 (0)