7f4ab8fbd8
Submodule updates include the following commits: * src/sonic-utilities 9dc58ea...f9eb739 (18): > Remove unnecessary calls to str.encode() now that the package is Python 3; Fix deprecation warning (#1260) > [generate_dump] Ignoring file/directory not found Errors (#1201) > Fixed porstat rate and util issues (#1140) > fix error: interface counters is mismatch after warm-reboot (#1099) > Remove unnecessary calls to str.decode() now that the package is Python 3 (#1255) > [acl-loader] Make list sorting compliant with Python 3 (#1257) > Replace hard-coded fast-reboot with variable. And some typo corrections (#1254) > [configlet][portconfig] Remove calls to dict.has_key() which is not available in Python 3 (#1247) > Remove unnecessary conversions to list() and calls to dict.keys() (#1243) > Clean up LGTM alerts (#1239) > Add 'requests' as install dependency in setup.py (#1240) > Convert to Python 3 (#1128) > Fix mock SonicV2Connector in python3: use decode_responses mode so caller code will be the same as python2 (#1238) > [tests] Do not trim from PATH if we did not append to it; Clean up/fix shebangs in scripts (#1233) > Updates to bgp config and show commands with BGP_INTERNAL_NEIGHBOR table (#1224) > [cli]: NAT show commands newline issue after migrated to Python3 (#1204) > [doc]: Update Command-Reference.md (#1231) > Added 'import sys' in feature.py file (#1232) * src/sonic-py-swsssdk 9d9f0c6...1664be9 (2): > Fix: no need to decode() after redis client scan, so it will work for both python2 and python3 (#96) > FieldValueMap `contains`(`in`) will also work when migrated to libswsscommon(C++ with SWIG wrapper) (#94) - Also fix Python 3-related issues: - Use integer (floor) division in config_samples.py (sonic-config-engine) - Replace print statement with print function in eeprom.py plugin for x86_64-kvm_x86_64-r0 platform - Update all platform plugins to be compatible with both Python 2 and Python 3 - Remove shebangs from plugins files which are not intended to be executable - Replace tabs with spaces in Python plugin files and fix alignment, because Python 3 is more strict - Remove trailing whitespace from plugins files
271 lines
6.8 KiB
Python
Executable File
271 lines
6.8 KiB
Python
Executable File
#
|
|
# Sample pddf_psuutil file
|
|
#
|
|
# All the supported PSU SysFS aattributes are
|
|
#- psu_present
|
|
#- psu_model_name
|
|
#- psu_power_good
|
|
#- psu_mfr_id
|
|
#- psu_serial_num
|
|
#- psu_fan_dir
|
|
#- psu_v_out
|
|
#- psu_i_out
|
|
#- psu_p_out
|
|
#- psu_fan1_speed_rpm
|
|
#
|
|
|
|
import os.path
|
|
import sys
|
|
sys.path.append('/usr/share/sonic/platform/plugins')
|
|
import pddfparse
|
|
import json
|
|
|
|
try:
|
|
from sonic_psu.psu_base import PsuBase
|
|
except ImportError as e:
|
|
raise ImportError(str(e) + "- required module not found")
|
|
|
|
|
|
class PsuUtil(PsuBase):
|
|
"""PDDF generic PSU util class"""
|
|
|
|
def __init__(self):
|
|
PsuBase.__init__(self)
|
|
global pddf_obj
|
|
global plugin_data
|
|
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd:
|
|
plugin_data = json.load(pd)
|
|
|
|
pddf_obj = pddfparse.PddfParse()
|
|
self.platform = pddf_obj.get_platform()
|
|
|
|
def get_num_psus(self):
|
|
return int(self.platform['num_psus'])
|
|
|
|
def get_psu_status(self, index):
|
|
if index is None:
|
|
return False
|
|
|
|
device = "PSU" + "%d" % index
|
|
output = pddf_obj.get_attr_name_output(device, "psu_power_good")
|
|
if not output:
|
|
return False
|
|
|
|
mode = output['mode']
|
|
val = output['status']
|
|
|
|
val = val.rstrip()
|
|
vmap = plugin_data['PSU']['psu_power_good'][mode]['valmap']
|
|
|
|
if val in vmap:
|
|
return vmap[val]
|
|
else:
|
|
return False
|
|
|
|
def get_psu_presence(self, index):
|
|
if index is None:
|
|
return False
|
|
|
|
status = 0
|
|
device = "PSU" + "%d" % index
|
|
output = pddf_obj.get_attr_name_output(device, "psu_present")
|
|
if not output:
|
|
return False
|
|
|
|
mode = output['mode']
|
|
status = output['status']
|
|
|
|
vmap = plugin_data['PSU']['psu_present'][mode]['valmap']
|
|
|
|
if status.rstrip('\n') in vmap:
|
|
return vmap[status.rstrip('\n')]
|
|
else:
|
|
return False
|
|
|
|
def get_powergood_status(self, idx):
|
|
if idx is None:
|
|
return False
|
|
|
|
if idx < 1 or idx > self.platform['num_psus']:
|
|
print("Invalid index %d\n" % idx)
|
|
return False
|
|
|
|
device = "PSU"+"%d" % (idx)
|
|
output = pddf_obj.get_attr_name_output(device, "psu_power_good")
|
|
if not output:
|
|
return False
|
|
|
|
mode = output['mode']
|
|
status = output['status']
|
|
|
|
vmap = plugin_data['PSU']['psu_power_good'][mode]['valmap']
|
|
|
|
if status.rstrip('\n') in vmap:
|
|
return vmap[status.rstrip('\n')]
|
|
else:
|
|
return False
|
|
|
|
def get_model(self, idx):
|
|
if idx is None:
|
|
return None
|
|
|
|
if idx < 1 or idx > self.platform['num_psus']:
|
|
print("Invalid index %d\n" % idx)
|
|
return None
|
|
|
|
device = "PSU"+"%d" % (idx)
|
|
output = pddf_obj.get_attr_name_output(device, "psu_model_name")
|
|
if not output:
|
|
return None
|
|
|
|
model = output['status']
|
|
|
|
# strip_non_ascii
|
|
stripped = (c for c in model if 0 < ord(c) < 127)
|
|
model = ''.join(stripped)
|
|
|
|
return model.rstrip('\n')
|
|
|
|
def get_mfr_id(self, idx):
|
|
if idx is None:
|
|
return None
|
|
|
|
if idx < 1 or idx > self.platform['num_psus']:
|
|
print("Invalid index %d\n" % idx)
|
|
return None
|
|
|
|
device = "PSU"+"%d" % (idx)
|
|
output = pddf_obj.get_attr_name_output(device, "psu_mfr_id")
|
|
if not output:
|
|
return None
|
|
|
|
mfr = output['status']
|
|
|
|
return mfr.rstrip('\n')
|
|
|
|
def get_serial(self, idx):
|
|
if idx is None:
|
|
return None
|
|
|
|
if idx < 1 or idx > self.platform['num_psus']:
|
|
print("Invalid index %d\n" % idx)
|
|
return None
|
|
|
|
device = "PSU"+"%d" % (idx)
|
|
output = pddf_obj.get_attr_name_output(device, "psu_serial_num")
|
|
if not output:
|
|
return None
|
|
|
|
serial = output['status']
|
|
|
|
return serial.rstrip('\n')
|
|
|
|
def get_direction(self, idx):
|
|
if idx is None:
|
|
return None
|
|
|
|
if idx < 1 or idx > self.platform['num_psus']:
|
|
print("Invalid index %d\n" % idx)
|
|
return None
|
|
|
|
device = "PSU"+"%d" % (idx)
|
|
output = pddf_obj.get_attr_name_output(device, "psu_fan_dir")
|
|
if not output:
|
|
return None
|
|
|
|
mode = output['mode']
|
|
direction = output['status'].rstrip('\n')
|
|
|
|
vmap = plugin_data['PSU']['psu_fan_dir'][mode]['valmap']
|
|
if direction in vmap:
|
|
airflow_dir_real = vmap[direction]
|
|
else:
|
|
airflow_dir_real = direction
|
|
|
|
return airflow_dir_real
|
|
|
|
def get_output_voltage(self, idx):
|
|
if idx is None:
|
|
return 0.0
|
|
|
|
if idx < 1 or idx > self.platform['num_psus']:
|
|
print("Invalid index %d\n" % idx)
|
|
return 0.0
|
|
|
|
device = "PSU"+"%d" % (idx)
|
|
output = pddf_obj.get_attr_name_output(device, "psu_v_out")
|
|
if not output:
|
|
return 0.0
|
|
|
|
v_out = output['status']
|
|
|
|
# value returned by the psu driver is in mV
|
|
return float(v_out)/1000
|
|
|
|
def get_output_current(self, idx):
|
|
if idx is None:
|
|
return 0.0
|
|
|
|
if idx < 1 or idx > self.platform['num_psus']:
|
|
print("Invalid index %d\n" % idx)
|
|
return 0.0
|
|
|
|
device = "PSU"+"%d" % (idx)
|
|
output = pddf_obj.get_attr_name_output(device, "psu_i_out")
|
|
if not output:
|
|
return 0.0
|
|
|
|
i_out = output['status']
|
|
|
|
# current in mA
|
|
return float(i_out)/1000
|
|
|
|
def get_output_power(self, idx):
|
|
if idx is None:
|
|
return 0.0
|
|
|
|
if idx < 1 or idx > self.platform['num_psus']:
|
|
print("Invalid index %d\n" % idx)
|
|
return 0.0
|
|
|
|
device = "PSU"+"%d" % (idx)
|
|
output = pddf_obj.get_attr_name_output(device, "psu_p_out")
|
|
if not output:
|
|
return 0.0
|
|
|
|
p_out = output['status']
|
|
|
|
# power is returned in micro watts
|
|
return float(p_out)/1000000
|
|
|
|
def get_fan_rpm(self, idx, fan_idx):
|
|
if idx is None or fan_idx is None:
|
|
return 0
|
|
|
|
if idx < 1 or idx > self.platform['num_psus']:
|
|
print("Invalid index %d\n" % idx)
|
|
return 0
|
|
|
|
device = "PSU"+"%d" % (idx)
|
|
num_fans = pddf_obj.get_num_psu_fans(device)
|
|
|
|
if fan_idx < 1 or fan_idx > num_fans:
|
|
print("Invalid PSU-fan index %d\n" % fan_idx)
|
|
return 0
|
|
|
|
output = pddf_obj.get_attr_name_output(device, "psu_fan"+str(fan_idx)+"_speed_rpm")
|
|
if not output:
|
|
return 0
|
|
|
|
#mode = output['mode']
|
|
output['status'] = output['status'].rstrip()
|
|
if output['status'].isalpha():
|
|
return 0
|
|
else:
|
|
speed = int(output['status'])
|
|
|
|
return speed
|
|
|
|
def dump_sysfs(self):
|
|
return pddf_obj.cli_dump_dsysfs('psu')
|