diff --git a/network/nxos/nxos_facts.py b/network/nxos/nxos_facts.py index 2770d54eeb3..af8df350710 100644 --- a/network/nxos/nxos_facts.py +++ b/network/nxos/nxos_facts.py @@ -193,25 +193,34 @@ class FactsBase(object): self.facts = dict() self.commands() + def transform_dict(self, data, keymap): + transform = dict() + for key, fact in keymap: + if key in data: + transform[fact] = data[key] + return transform + + def transform_iterable(self, iterable, keymap): + for item in iterable: + yield self.transform_dict(item, keymap) + class Default(FactsBase): - SYSTEM_MAP = { - 'sys_ver_str': 'version', - 'proc_board_id': 'serialnum', - 'chassis_id': 'model', - 'isan_file_name': 'image', - 'host_name': 'hostname' - } + VERSION_MAP = frozenset([ + ('sys_ver_str', 'version'), + ('proc_board_id', 'serialnum'), + ('chassis_id', 'model'), + ('isan_file_name', 'image'), + ('host_name', 'hostname') + ]) def commands(self): add_command(self.runner, 'show version', output='json') def populate(self): data = self.runner.get_command('show version', output='json') - for key, value in self.SYSTEM_MAP.iteritems(): - if key in data: - self.facts[value] = data[key] + self.facts.update(self.transform_dict(data, self.VERSION_MAP)) class Config(FactsBase): @@ -242,29 +251,27 @@ class Hardware(FactsBase): class Interfaces(FactsBase): - INTERFACE_MAP = { - 'state': 'state', - 'desc': 'description', - 'eth_bw': 'bandwidth', - 'eth_duplex': 'duplex', - 'eth_speed': 'speed', - 'eth_mode': 'mode', - 'eth_ip_addr': 'address', - 'eth_ip_mask': 'masklen', - 'eth_hw_addr': 'macaddress', - 'eth_mtu': 'mtu', - 'eth_hw_desc': 'type' - } + INTERFACE_MAP = frozenset([ + ('state', 'state'), + ('desc', 'description'), + ('eth_bw', 'bandwidth'), + ('eth_duplex','duplex'), + ('eth_speed', 'speed'), + ('eth_mode', 'mode'), + ('eth_hw_addr', 'macaddress'), + ('eth_mtu', 'mtu'), + ('eth_hw_desc', 'type') + ]) - INTERFACE_IPV4_MAP = { - 'eth_ip_addr': 'address', - 'eth_ip_mask': 'masklen' - } + INTERFACE_IPV4_MAP = frozenset([ + ('eth_ip_addr', 'address'), + ('eth_ip_mask', 'masklen') + ]) - INTERFACE_IPV6_MAP = { - 'addr': 'address', - 'prefix': 'subnet' - } + INTERFACE_IPV6_MAP = frozenset([ + ('addr', 'address'), + ('prefix', 'subnet') + ]) def commands(self): add_command(self.runner, 'show interface', output='json') @@ -302,18 +309,13 @@ class Interfaces(FactsBase): def populate_interfaces(self, data): interfaces = dict() for item in data['TABLE_interface']['ROW_interface']: - intf = dict() name = item['interface'] - for key, value in self.INTERFACE_MAP.iteritems(): - if key in item: - intf[value] = item[key] + intf = dict() + intf.update(self.transform_dict(item, self.INTERFACE_MAP)) if 'eth_ip_addr' in item: - intf['ipv4'] = dict() - for key, value in self.INTERFACE_IPV4_MAP.iteritems(): - if key in item: - intf['ipv4'][value] = item[key] + intf['ipv4'] = self.transform_dict(item, self.INTERFACE_IPV4_MAP) self.facts['all_ipv4_addresses'].append(item['eth_ip_addr']) interfaces[name] = intf @@ -338,23 +340,47 @@ class Interfaces(FactsBase): def parse_ipv6_interfaces(self, data): data = data['TABLE_intf'] - if isinstance(data, dict): data = [data] - for item in data: name = item['ROW_intf']['intf-name'] intf = self.facts['interfaces'][name] - - intf['ipv6'] = dict() - for key, value in self.INTERFACE_IPV6_MAP.iteritems(): - intf['ipv6'][value] = item['ROW_intf'][key] - + intf['ipv6'] = self.transform_dict(item, self.INTERFACE_IPV6_MAP) self.facts['all_ipv6_addresses'].append(item['ROW_intf']['addr']) class Legacy(FactsBase): # facts from nxos_facts 2.1 + VERSION_MAP = frozenset([ + ('host_name', '_hostname'), + ('kickstart_ver_str', '_os'), + ('chassis_id', '_platform') + ]) + + MODULE_MAP = frozenset([ + ('model', 'model'), + ('modtype', 'type'), + ('ports', 'ports'), + ('status', 'status') + ]) + + FAN_MAP = frozenset([ + ('fanname', 'name'), + ('fanmodel', 'model'), + ('fanhwver', 'hw_ver'), + ('fandir', 'direction'), + ('fanstatus', 'status') + ]) + + POWERSUP_MAP = frozenset([ + ('psmodel', 'model'), + ('psnum', 'number'), + ('ps_status', 'status'), + ('actual_out', 'actual_output'), + ('actual_in', 'actual_in'), + ('total_capa', 'total_capacity') + ]) + def commands(self): add_command(self.runner, 'show version', output='json') add_command(self.runner, 'show module', output='json') @@ -364,15 +390,7 @@ class Legacy(FactsBase): def populate(self): data = self.runner.get_command('show version', 'json') - self.facts['_hostname'] = data['host_name'] - self.facts['_kickstart'] = data['kickstart_ver_str'] - self.facts['_platform'] = data['chassis_id'] - - if 'rr_sys_ver' in data: - self.facts['_os'] = data['rr_sys_ver'] - - if 'rr_reason' in data: - self.facts['_rr'] = data['rr_reason'] + self.facts.update(self.transform_dict(data, self.VERSION_MAP)) data = self.runner.get_command('show interface', 'json') self.facts['_interfaces_list'] = self.parse_interfaces(data) @@ -404,49 +422,21 @@ class Legacy(FactsBase): return objects def parse_module(self, data): - modules = list() - for item in data['TABLE_modinfo']['ROW_modinfo']: - mod = dict() - mod['model'] = item['model'] - mod['type'] = item['modtype'] - mod['ports'] = item['ports'] - mod['status'] = item['status'] - modules.append(mod) - return modules + data = data['TABLE_modinfo']['ROW_modinfo'] + objects = list(self.transform_iterable(data, self.MODULE_MAP)) + return objects def parse_fan_info(self, data): - objects = list() - for item in data['fandetails']['TABLE_faninfo']['ROW_faninfo']: - obj = dict() - obj['name'] = item['fanname'] - obj['model'] = item['fanmodel'] - if 'fanhwver' in item: - obj['hw_ver'] = item['fanhwver'] - if 'fandir' in item: - obj['direction'] = item['fandir'] - if 'fanstatus' in item: - obj['status'] = item['fanstatus'] - objects.append(obj) + data = data['fandetails']['TABLE_faninfo']['ROW_faninfo'] + objects = list(self.transform_iterable(data, self.FAN_MAP)) return objects def parse_power_supply_info(self, data): - objects = list() - for item in data['powersup']['TABLE_psinfo']['ROW_psinfo']: - obj = dict() - obj['model'] = item['psmodel'] - obj['number'] = item['psnum'] - obj['status'] = item['ps_status'] - if 'actual_out' in item: - obj['actual_output'] = item['actual_out'] - if 'actual_in' in item: - obj['actual_in'] = item['actual_in'] - if 'total_capa' in item: - obj['total_capacity'] = item['total_capa'] - objects.append(obj) + data = data['powersup']['TABLE_psinfo']['ROW_psinfo'] + objects = list(self.transform_iterable(data, self.POWERSUP_MAP)) return objects - FACT_SUBSETS = dict( default=Default, legacy=Legacy,