Use latest version of python construct

Also increasing minimum version to 2.9.39 for String class name
change to PaddedString.

Change-Id: Ie7b80f4698a77208c89797b82f7e41fcd8dbf168
This commit is contained in:
Riccardo Pittau 2020-05-01 13:31:25 +02:00
parent f3e27c1916
commit 721bd814a6
8 changed files with 27 additions and 20 deletions

View File

@ -102,6 +102,10 @@ class LLDPParser(object):
"""Add a single name/value pair to the nv dict""" """Add a single name/value pair to the nv dict"""
self.set_value(name, struct.value) self.set_value(name, struct.value)
def add_nested_value(self, struct, name, data):
"""Add a single nested name/value pair to the dict"""
self.set_value(name, struct.value.value)
def parse_tlv(self, tlv_type, data): def parse_tlv(self, tlv_type, data):
"""Parse TLVs from mapping table """Parse TLVs from mapping table
@ -193,10 +197,10 @@ class LLDPBasicMgmtParser(LLDPParser):
self.parser_map = { self.parser_map = {
tlv.LLDP_TLV_CHASSIS_ID: tlv.LLDP_TLV_CHASSIS_ID:
(self.add_single_value, tlv.ChassisId, (self.add_nested_value, tlv.ChassisId, LLDP_CHASSIS_ID_NM,
LLDP_CHASSIS_ID_NM, False), False),
tlv.LLDP_TLV_PORT_ID: tlv.LLDP_TLV_PORT_ID:
(self.add_single_value, tlv.PortId, LLDP_PORT_ID_NM, False), (self.add_nested_value, tlv.PortId, LLDP_PORT_ID_NM, False),
tlv.LLDP_TLV_TTL: (None, None, None, False), tlv.LLDP_TLV_TTL: (None, None, None, False),
tlv.LLDP_TLV_PORT_DESCRIPTION: tlv.LLDP_TLV_PORT_DESCRIPTION:
(self.add_single_value, tlv.PortDesc, LLDP_PORT_DESC_NM, (self.add_single_value, tlv.PortDesc, LLDP_PORT_DESC_NM,
@ -221,6 +225,7 @@ class LLDPBasicMgmtParser(LLDPParser):
There can be multiple Mgmt Address TLVs, store in list. There can be multiple Mgmt Address TLVs, store in list.
""" """
if struct.address:
self.append_value(name, struct.address) self.append_value(name, struct.address)
def _get_capabilities_list(self, caps): def _get_capabilities_list(self, caps):

View File

@ -107,11 +107,11 @@ IANA_ADDRESS_FAMILY_ID_MAPPING = {
('mac', 6): MACAddress, ('mac', 6): MACAddress,
} }
IANAAddress = core.Embedded(core.Struct( IANAAddress = core.Struct(
'family' / core.Enum(core.Int8ub, **mapping_for_enum( 'family' / core.Enum(core.Int8ub, **mapping_for_enum(
IANA_ADDRESS_FAMILY_ID_MAPPING)), IANA_ADDRESS_FAMILY_ID_MAPPING)),
'value' / core.Switch(construct.this.family, mapping_for_switch( 'value' / core.Switch(construct.this.family, mapping_for_switch(
IANA_ADDRESS_FAMILY_ID_MAPPING)))) IANA_ADDRESS_FAMILY_ID_MAPPING)))
# Note that 'GreedyString()' is used in cases where string len is not defined # Note that 'GreedyString()' is used in cases where string len is not defined
CHASSIS_ID_MAPPING = { CHASSIS_ID_MAPPING = {
@ -132,9 +132,8 @@ CHASSIS_ID_MAPPING = {
ChassisId = core.Struct( ChassisId = core.Struct(
'subtype' / core.Enum(core.Byte, **mapping_for_enum( 'subtype' / core.Enum(core.Byte, **mapping_for_enum(
CHASSIS_ID_MAPPING)), CHASSIS_ID_MAPPING)),
'value' / 'value' / core.Switch(construct.this.subtype,
core.Embedded(core.Switch(construct.this.subtype, mapping_for_switch(CHASSIS_ID_MAPPING))
mapping_for_switch(CHASSIS_ID_MAPPING)))
) )
PORT_ID_MAPPING = { PORT_ID_MAPPING = {
@ -150,9 +149,8 @@ PORT_ID_MAPPING = {
PortId = core.Struct( PortId = core.Struct(
'subtype' / core.Enum(core.Byte, **mapping_for_enum( 'subtype' / core.Enum(core.Byte, **mapping_for_enum(
PORT_ID_MAPPING)), PORT_ID_MAPPING)),
'value' / 'value' / core.Switch(construct.this.subtype,
core.Embedded(core.Switch(construct.this.subtype, mapping_for_switch(PORT_ID_MAPPING))
mapping_for_switch(PORT_ID_MAPPING)))
) )
PortDesc = core.Struct('value' / core.GreedyString("utf8")) PortDesc = core.Struct('value' / core.GreedyString("utf8"))
@ -215,7 +213,7 @@ Dot1_VlanName = core.Struct(
'vlanid' / core.Int16ub, 'vlanid' / core.Int16ub,
'name_len' / core.Rebuild(core.Int8ub, 'name_len' / core.Rebuild(core.Int8ub,
construct.len_(construct.this.value)), construct.len_(construct.this.value)),
'vlan_name' / core.String(construct.this.name_len, "utf8") 'vlan_name' / core.PaddedString(construct.this.name_len, "utf8")
) )
Dot1_ProtocolIdentity = core.Struct( Dot1_ProtocolIdentity = core.Struct(

View File

@ -69,7 +69,6 @@ class LLDPBasicProcessingHook(base.ProcessingHook):
for iface in inventory['interfaces']: for iface in inventory['interfaces']:
if_name = iface['name'] if_name = iface['name']
tlvs = iface.get('lldp') tlvs = iface.get('lldp')
if tlvs is None: if tlvs is None:
LOG.warning("No LLDP Data found for interface %s", LOG.warning("No LLDP Data found for interface %s",

View File

@ -67,7 +67,7 @@ class GenericLocalLinkConnectionHook(base.ProcessingHook):
return return
item = PORT_ID_ITEM_NAME item = PORT_ID_ITEM_NAME
value = port_id.value value = port_id.value.value if port_id.value else None
elif tlv_type == tlv.LLDP_TLV_CHASSIS_ID: elif tlv_type == tlv.LLDP_TLV_CHASSIS_ID:
try: try:
chassis_id = tlv.ChassisId.parse(data) chassis_id = tlv.ChassisId.parse(data)
@ -79,7 +79,7 @@ class GenericLocalLinkConnectionHook(base.ProcessingHook):
# Only accept mac address for chassis ID # Only accept mac address for chassis ID
if 'mac_address' in chassis_id.subtype: if 'mac_address' in chassis_id.subtype:
item = SWITCH_ID_ITEM_NAME item = SWITCH_ID_ITEM_NAME
value = chassis_id.value value = chassis_id.value.value
if item and value: if item and value:
if (not CONF.processing.overwrite_existing and if (not CONF.processing.overwrite_existing and
@ -98,7 +98,6 @@ class GenericLocalLinkConnectionHook(base.ProcessingHook):
value = lldp_proc_data['lldp_processed'].get(name) value = lldp_proc_data['lldp_processed'].get(name)
if value: if value:
# Only accept mac address for chassis ID # Only accept mac address for chassis ID
if (item == SWITCH_ID_ITEM_NAME and if (item == SWITCH_ID_ITEM_NAME and
not netutils.is_valid_mac(value)): not netutils.is_valid_mac(value)):

View File

@ -286,7 +286,7 @@ class TestLLDPBasicProcessingHook(test_base.NodeTest):
}] }]
self.hook.before_update(self.data, self.node_info) self.hook.before_update(self.data, self.node_info)
self.assertEqual(self.expected, self.data['all_interfaces']) self.assertEqual(self.expected, self.data['all_interfaces'])
self.assertEqual(2, mock_log.call_count) self.assertEqual(1, mock_log.call_count)
@mock.patch.object(nv.LOG, 'warning', autospec=True) @mock.patch.object(nv.LOG, 'warning', autospec=True)
def test_truncated_mac(self, mock_log): def test_truncated_mac(self, mock_log):

View File

@ -2,7 +2,7 @@ alembic==0.8.10
automaton==1.9.0 automaton==1.9.0
Babel==2.3.4 Babel==2.3.4
bandit==1.1.0 bandit==1.1.0
construct==2.8.10 construct==2.9.39
coverage==4.0 coverage==4.0
doc8==0.6.0 doc8==0.6.0
eventlet==0.18.2 eventlet==0.18.2

View File

@ -0,0 +1,6 @@
---
upgrade:
- |
Remove upper constraint for python construct library and use the latest
version available.
The minimum compatible version for python construct is now 2.9.39

View File

@ -3,7 +3,7 @@
# process, which may cause wedges in the gate later. # process, which may cause wedges in the gate later.
automaton>=1.9.0 # Apache-2.0 automaton>=1.9.0 # Apache-2.0
alembic>=0.8.10 # MIT alembic>=0.8.10 # MIT
construct<2.9,>=2.8.10 # MIT construct>=2.9.39 # MIT
eventlet!=0.18.3,!=0.20.1,>=0.18.2 # MIT eventlet!=0.18.3,!=0.20.1,>=0.18.2 # MIT
Flask>=1.0 # BSD Flask>=1.0 # BSD
futurist>=1.2.0 # Apache-2.0 futurist>=1.2.0 # Apache-2.0