pyghmi 1.5.64__py3-none-any.whl → 1.5.66__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyghmi/ipmi/command.py +12 -0
- pyghmi/ipmi/oem/generic.py +77 -1
- pyghmi/ipmi/oem/lenovo/energy.py +1 -0
- pyghmi/ipmi/oem/lenovo/imm.py +22 -8
- pyghmi/redfish/command.py +70 -0
- pyghmi/redfish/oem/generic.py +9 -3
- pyghmi/redfish/oem/lenovo/xcc.py +39 -13
- {pyghmi-1.5.64.dist-info → pyghmi-1.5.66.dist-info}/AUTHORS +1 -0
- {pyghmi-1.5.64.dist-info → pyghmi-1.5.66.dist-info}/METADATA +1 -1
- {pyghmi-1.5.64.dist-info → pyghmi-1.5.66.dist-info}/RECORD +15 -15
- pyghmi-1.5.66.dist-info/pbr.json +1 -0
- pyghmi-1.5.64.dist-info/pbr.json +0 -1
- {pyghmi-1.5.64.dist-info → pyghmi-1.5.66.dist-info}/LICENSE +0 -0
- {pyghmi-1.5.64.dist-info → pyghmi-1.5.66.dist-info}/WHEEL +0 -0
- {pyghmi-1.5.64.dist-info → pyghmi-1.5.66.dist-info}/entry_points.txt +0 -0
- {pyghmi-1.5.64.dist-info → pyghmi-1.5.66.dist-info}/top_level.txt +0 -0
pyghmi/ipmi/command.py
CHANGED
@@ -778,6 +778,18 @@ class Command(object):
|
|
778
778
|
summary['badreadings'] = fallbackreadings
|
779
779
|
return summary
|
780
780
|
|
781
|
+
def get_system_power_watts(self):
|
782
|
+
self.oem_init()
|
783
|
+
return self._oem.get_system_power_watts(self)
|
784
|
+
|
785
|
+
def get_inlet_temperature(self):
|
786
|
+
self.oem_init()
|
787
|
+
return self._oem.get_inlet_temperature(self)
|
788
|
+
|
789
|
+
def get_average_processor_temperature(self):
|
790
|
+
self.oem_init()
|
791
|
+
return self._oem.get_average_processor_temperature(self)
|
792
|
+
|
781
793
|
def get_sensor_reading(self, sensorname):
|
782
794
|
"""Get a sensor reading by name
|
783
795
|
|
pyghmi/ipmi/oem/generic.py
CHANGED
@@ -14,7 +14,8 @@
|
|
14
14
|
|
15
15
|
import pyghmi.exceptions as exc
|
16
16
|
import pyghmi.ipmi.private.constants as event_const
|
17
|
-
|
17
|
+
import pyghmi.ipmi.sdr as ipmisdr
|
18
|
+
import struct
|
18
19
|
|
19
20
|
class OEMHandler(object):
|
20
21
|
"""Handler class for OEM capabilities.
|
@@ -41,6 +42,81 @@ class OEMHandler(object):
|
|
41
42
|
"""
|
42
43
|
return {}
|
43
44
|
|
45
|
+
def get_system_power_watts(self, ipmicmd):
|
46
|
+
# Use DCMI getpower reading command
|
47
|
+
rsp = ipmicmd.xraw_command(netfn=0x2c, command=2, data=(0xdc, 1, 0, 0))
|
48
|
+
wattage = struct.unpack('<H', rsp['data'][1:3])[0]
|
49
|
+
return wattage
|
50
|
+
|
51
|
+
def get_average_processor_temperature(self, ipmicmd):
|
52
|
+
# DCMI suggests preferrence for 0x37 ('Air inlet')
|
53
|
+
# If not that, then 0x40 ('Air inlet')
|
54
|
+
# in practice, some implementations use 0x27 ('External environment')
|
55
|
+
if not hasattr(self, '_processor_names'):
|
56
|
+
self._processor_names = []
|
57
|
+
readings = []
|
58
|
+
if not self._processor_names:
|
59
|
+
sdr = ipmicmd.init_sdr()
|
60
|
+
for sensename in sdr.sensors:
|
61
|
+
sensor = sdr.sensors[sensename]
|
62
|
+
if sensor.reading_type != 1:
|
63
|
+
continue
|
64
|
+
if not sensor.baseunit:
|
65
|
+
continue
|
66
|
+
if sensor.sensor_type != 'Temperature':
|
67
|
+
continue
|
68
|
+
if sensor.entity == 'Processor':
|
69
|
+
self._processor_names.append(sensor.sensor_name)
|
70
|
+
readingvalues = []
|
71
|
+
for procsensor in self._processor_names:
|
72
|
+
try:
|
73
|
+
reading = ipmicmd.get_sensor_reading(procsensor)
|
74
|
+
except exc.IpmiException:
|
75
|
+
continue
|
76
|
+
if reading.value is not None:
|
77
|
+
readingvalues.append(float(reading.value))
|
78
|
+
tmplreading = ipmisdr.SensorReading({'name': 'Average Processor Temperature', 'type': 'Temperature'}, '°C')
|
79
|
+
if readingvalues:
|
80
|
+
tmplreading.value = sum(readingvalues) / len(readingvalues)
|
81
|
+
else:
|
82
|
+
tmplreading.value = None
|
83
|
+
tmplreading.unavailable = 1
|
84
|
+
return tmplreading
|
85
|
+
|
86
|
+
|
87
|
+
def get_inlet_temperature(self, ipmicmd):
|
88
|
+
# DCMI suggests preferrence for 0x37 ('Air inlet')
|
89
|
+
# If not that, then 0x40 ('Air inlet')
|
90
|
+
# in practice, some implementations use 0x27 ('External environment')
|
91
|
+
if not hasattr(self, '_inlet_name'):
|
92
|
+
self._inlet_name = None
|
93
|
+
if self._inlet_name:
|
94
|
+
return ipmicmd.get_sensor_reading(self._inlet_name)
|
95
|
+
sdr = ipmicmd.init_sdr()
|
96
|
+
extenv = []
|
97
|
+
airinlets = []
|
98
|
+
for sensename in sdr.sensors:
|
99
|
+
sensor = sdr.sensors[sensename]
|
100
|
+
if sensor.reading_type != 1:
|
101
|
+
continue
|
102
|
+
if not sensor.baseunit:
|
103
|
+
continue
|
104
|
+
if sensor.sensor_type != 'Temperature':
|
105
|
+
continue
|
106
|
+
if sensor.entity == 'External environment':
|
107
|
+
extenv.append(sensor.sensor_name)
|
108
|
+
if sensor.entity == 'Air inlet':
|
109
|
+
airinlets.append(sensor.sensor_name)
|
110
|
+
if airinlets:
|
111
|
+
if len(airinlets) > 1:
|
112
|
+
raise Exception('TODO: how to deal with multiple inlets')
|
113
|
+
self._inlet_name = airinlets[0]
|
114
|
+
elif extenv:
|
115
|
+
if len(extenv) > 1:
|
116
|
+
raise Exception('TODO: how to deal with multiple external environments')
|
117
|
+
self._inlet_name = extenv[0]
|
118
|
+
return ipmicmd.get_sensor_reading(self._inlet_name)
|
119
|
+
|
44
120
|
def process_event(self, event, ipmicmd, seldata):
|
45
121
|
"""Modify an event according with OEM understanding.
|
46
122
|
|
pyghmi/ipmi/oem/lenovo/energy.py
CHANGED
@@ -28,6 +28,7 @@ class EnergyManager(object):
|
|
28
28
|
# get the handle (which has always been the same, but just in case
|
29
29
|
self.iana = bytearray(b'\x66\x4a\x00')
|
30
30
|
self._usefapm = False
|
31
|
+
self._mypowermeters = ()
|
31
32
|
try:
|
32
33
|
rsp = ipmicmd.xraw_command(netfn=0x3a, command=0x32, data=[4, 2, 0, 0, 0])
|
33
34
|
if len(rsp['data']) >= 8:
|
pyghmi/ipmi/oem/lenovo/imm.py
CHANGED
@@ -104,7 +104,7 @@ def fixup_str(propstr):
|
|
104
104
|
def str_to_size(sizestr):
|
105
105
|
if 'GB' in sizestr:
|
106
106
|
sizestr = sizestr.replace('GB', '')
|
107
|
-
sizestr = int(float(sizestr) *
|
107
|
+
sizestr = int(float(sizestr) * 1000)
|
108
108
|
elif 'GiB' in sizestr:
|
109
109
|
sizestr = sizestr.replace('GiB', '')
|
110
110
|
sizestr = int(float(sizestr) * 1024)
|
@@ -1336,8 +1336,12 @@ class XCCClient(IMMClient):
|
|
1336
1336
|
|
1337
1337
|
def get_disk_hardware(self, diskent, prefix=''):
|
1338
1338
|
bdata = {}
|
1339
|
-
if not prefix
|
1340
|
-
|
1339
|
+
if not prefix:
|
1340
|
+
location = diskent.get('location', '')
|
1341
|
+
if location.startswith('M.2'):
|
1342
|
+
prefix = 'M.2-'
|
1343
|
+
elif location.startswith('7MM'):
|
1344
|
+
prefix = '7MM-'
|
1341
1345
|
diskname = 'Disk {1}{0}'.format(diskent['slotNo'], prefix)
|
1342
1346
|
bdata['Model'] = diskent['productName'].rstrip()
|
1343
1347
|
bdata['Serial Number'] = diskent['serialNo'].rstrip()
|
@@ -1347,8 +1351,12 @@ class XCCClient(IMMClient):
|
|
1347
1351
|
|
1348
1352
|
def get_disk_firmware(self, diskent, prefix=''):
|
1349
1353
|
bdata = {}
|
1350
|
-
if not prefix
|
1351
|
-
|
1354
|
+
if not prefix:
|
1355
|
+
location = diskent.get('location', '')
|
1356
|
+
if location.startswith('M.2'):
|
1357
|
+
prefix = 'M.2-'
|
1358
|
+
elif location.startswith('7MM'):
|
1359
|
+
prefix = '7MM-'
|
1352
1360
|
diskname = 'Disk {1}{0}'.format(diskent['slotNo'], prefix)
|
1353
1361
|
bdata['model'] = diskent[
|
1354
1362
|
'productName'].rstrip()
|
@@ -2054,13 +2062,18 @@ class XCCClient(IMMClient):
|
|
2054
2062
|
complete = False
|
2055
2063
|
phase = "apply"
|
2056
2064
|
statetype = 'TaskState'
|
2057
|
-
|
2065
|
+
# sometimes we get an empty pgress when transitioning from the apply phase to
|
2066
|
+
# the validating phase; add a retry here so we don't exit the loop in this case
|
2067
|
+
retry = 3
|
2068
|
+
while not complete and retry > 0:
|
2058
2069
|
pgress, status = self.grab_redfish_response_with_status(
|
2059
2070
|
monitorurl)
|
2060
2071
|
if status < 200 or status >= 300:
|
2061
2072
|
raise Exception(pgress)
|
2062
2073
|
if not pgress:
|
2063
|
-
|
2074
|
+
retry -= 1
|
2075
|
+
ipmisession.Session.pause(3)
|
2076
|
+
continue
|
2064
2077
|
for msg in pgress.get('Messages', []):
|
2065
2078
|
if 'Verify failed' in msg.get('Message', ''):
|
2066
2079
|
raise Exception(msg['Message'])
|
@@ -2072,7 +2085,8 @@ class XCCClient(IMMClient):
|
|
2072
2085
|
complete = state == 'Completed'
|
2073
2086
|
progress({'phase': phase, 'progress': pct})
|
2074
2087
|
if complete:
|
2075
|
-
|
2088
|
+
msgs = pgress.get('Messages', [])
|
2089
|
+
if msgs and 'OperationTransitionedToJob' in msgs[0].get('MessageId', ''):
|
2076
2090
|
monitorurl = pgress['Messages'][0]['MessageArgs'][0]
|
2077
2091
|
phase = 'validating'
|
2078
2092
|
statetype = 'JobState'
|
pyghmi/redfish/command.py
CHANGED
@@ -142,6 +142,16 @@ class SensorReading(object):
|
|
142
142
|
self.imprecision = None
|
143
143
|
self.units = units
|
144
144
|
self.unavailable = unavailable
|
145
|
+
|
146
|
+
def __repr__(self):
|
147
|
+
return repr({
|
148
|
+
'value': self.value,
|
149
|
+
'state_ids': self.state_ids,
|
150
|
+
'units': self.units,
|
151
|
+
'imprecision': self.imprecision,
|
152
|
+
'name': self.name,
|
153
|
+
'unavailable': self.unavailable,
|
154
|
+
})
|
145
155
|
|
146
156
|
|
147
157
|
class Command(object):
|
@@ -509,6 +519,8 @@ class Command(object):
|
|
509
519
|
def _do_web_request(self, url, payload=None, method=None, cache=True,
|
510
520
|
etag=None):
|
511
521
|
res = None
|
522
|
+
if cache is True:
|
523
|
+
cache = 30
|
512
524
|
if cache and payload is None and method is None:
|
513
525
|
res = self._get_cache(url, cache)
|
514
526
|
if res:
|
@@ -652,6 +664,14 @@ class Command(object):
|
|
652
664
|
for subchassis in chassisinfo.get('Links', {}).get('Contains', []):
|
653
665
|
self._mapchassissensors(subchassis)
|
654
666
|
|
667
|
+
def _get_thermals(self, chassis):
|
668
|
+
chassisurl = chassis['@odata.id']
|
669
|
+
chassisinfo = self._do_web_request(chassisurl)
|
670
|
+
thermurl = chassisinfo.get('Thermal', {}).get('@odata.id', '')
|
671
|
+
if thermurl:
|
672
|
+
therminf = self._do_web_request(thermurl, cache=1)
|
673
|
+
return therminf.get('Temperatures', [])
|
674
|
+
|
655
675
|
@property
|
656
676
|
def _bmcurl(self):
|
657
677
|
if not self._varbmcurl:
|
@@ -1129,6 +1149,56 @@ class Command(object):
|
|
1129
1149
|
log.get('Severity', 'Warning'), const.Health.Ok)
|
1130
1150
|
yield record
|
1131
1151
|
|
1152
|
+
def _get_chassis_env(self, chassis):
|
1153
|
+
chassisurl = chassis['@odata.id']
|
1154
|
+
chassisinfo = self._do_web_request(chassisurl)
|
1155
|
+
envurl = chassisinfo.get('EnvironmentMetrics', {}).get('@odata.id', '')
|
1156
|
+
envmetric = self._do_web_request(envurl, cache=1)
|
1157
|
+
retval = {
|
1158
|
+
'watts': envmetric.get('PowerWatts', {}).get('Reading', None),
|
1159
|
+
'inlet': envmetric.get('TemperatureCelsius', {}).get('Reading', None)
|
1160
|
+
}
|
1161
|
+
return retval
|
1162
|
+
|
1163
|
+
def get_average_processor_temperature(self):
|
1164
|
+
cputemps = []
|
1165
|
+
for chassis in self.sysinfo.get('Links', {}).get('Chassis', []):
|
1166
|
+
thermals = self._get_thermals(chassis)
|
1167
|
+
for temp in thermals:
|
1168
|
+
if temp.get('PhysicalContext', '') != 'CPU':
|
1169
|
+
continue
|
1170
|
+
if temp.get('ReadingCelsius', None) is None:
|
1171
|
+
continue
|
1172
|
+
cputemps.append(temp['ReadingCelsius'])
|
1173
|
+
if not cputemps:
|
1174
|
+
return SensorReading(
|
1175
|
+
None, {'name': 'Average Processor Temperature'}, value=None, units='°C',
|
1176
|
+
unavailable=True)
|
1177
|
+
avgtemp = sum(cputemps) / len(cputemps)
|
1178
|
+
return SensorReading(
|
1179
|
+
None, {'name': 'Average Processor Temperature'}, value=avgtemp, units='°C')
|
1180
|
+
|
1181
|
+
def get_system_power_watts(self):
|
1182
|
+
totalwatts = 0
|
1183
|
+
for chassis in self.sysinfo.get('Links', {}).get('Chassis', []):
|
1184
|
+
envinfo = self._get_chassis_env(chassis)
|
1185
|
+
totalwatts += envinfo['watts']
|
1186
|
+
return totalwatts
|
1187
|
+
|
1188
|
+
def get_inlet_temperature(self):
|
1189
|
+
inlets = []
|
1190
|
+
for chassis in self.sysinfo.get('Links', {}).get('Chassis', []):
|
1191
|
+
envinfo = self._get_chassis_env(chassis)
|
1192
|
+
inlets.append(envinfo['inlet'])
|
1193
|
+
if inlets:
|
1194
|
+
val = sum(inlets) / len(inlets)
|
1195
|
+
unavail = False
|
1196
|
+
else:
|
1197
|
+
val = None
|
1198
|
+
unavail = True
|
1199
|
+
return SensorReading(
|
1200
|
+
None, {'name': 'Inlet Temperature'}, value=val, units='°C',
|
1201
|
+
unavailable=unavail)
|
1132
1202
|
def get_sensor_descriptions(self):
|
1133
1203
|
for sensor in natural_sort(self._sensormap):
|
1134
1204
|
yield self._sensormap[sensor]
|
pyghmi/redfish/oem/generic.py
CHANGED
@@ -820,10 +820,15 @@ class OEMHandler(object):
|
|
820
820
|
complete = False
|
821
821
|
phase = "apply"
|
822
822
|
statetype = 'TaskState'
|
823
|
-
|
823
|
+
# sometimes we get an empty pgress when transitioning from the apply phase to
|
824
|
+
# the validating phase; add a retry here so we don't exit the loop in this case
|
825
|
+
retry = 3
|
826
|
+
while not complete and retry > 0:
|
824
827
|
pgress = self._do_web_request(monitorurl, cache=False)
|
825
828
|
if not pgress:
|
826
|
-
|
829
|
+
retry -= 1
|
830
|
+
time.sleep(3)
|
831
|
+
continue
|
827
832
|
for msg in pgress.get('Messages', []):
|
828
833
|
if 'Verify failed' in msg.get('Message', ''):
|
829
834
|
raise Exception(msg['Message'])
|
@@ -836,7 +841,8 @@ class OEMHandler(object):
|
|
836
841
|
complete = state == 'Completed'
|
837
842
|
progress({'phase': phase, 'progress': pct})
|
838
843
|
if complete:
|
839
|
-
|
844
|
+
msgs = pgress.get('Messages', [])
|
845
|
+
if msgs and 'OperationTransitionedToJob' in msgs[0].get('MessageId', ''):
|
840
846
|
monitorurl = pgress['Messages'][0]['MessageArgs'][0]
|
841
847
|
phase = 'validating'
|
842
848
|
statetype = 'JobState'
|
pyghmi/redfish/oem/lenovo/xcc.py
CHANGED
@@ -102,6 +102,22 @@ def natural_sort(iterable):
|
|
102
102
|
return sorted(iterable)
|
103
103
|
|
104
104
|
|
105
|
+
def str_to_size(sizestr):
|
106
|
+
if 'GB' in sizestr:
|
107
|
+
sizestr = sizestr.replace('GB', '')
|
108
|
+
sizestr = int(float(sizestr) * 1000)
|
109
|
+
elif 'GiB' in sizestr:
|
110
|
+
sizestr = sizestr.replace('GiB', '')
|
111
|
+
sizestr = int(float(sizestr) * 1024)
|
112
|
+
elif 'TB' in sizestr:
|
113
|
+
sizestr = sizestr.replace('TB', '')
|
114
|
+
sizestr = int(float(sizestr) * 1000 * 1000)
|
115
|
+
elif 'TiB' in sizestr:
|
116
|
+
sizestr = sizestr.replace('TiB', '')
|
117
|
+
sizestr = int(float(sizestr) * 1024 * 1024)
|
118
|
+
return sizestr
|
119
|
+
|
120
|
+
|
105
121
|
class OEMHandler(generic.OEMHandler):
|
106
122
|
logouturl = '/api/providers/logout'
|
107
123
|
bmcname = 'XCC'
|
@@ -630,8 +646,12 @@ class OEMHandler(generic.OEMHandler):
|
|
630
646
|
|
631
647
|
def _get_disk_firmware_single(self, diskent, prefix=''):
|
632
648
|
bdata = {}
|
633
|
-
if not prefix
|
634
|
-
|
649
|
+
if not prefix:
|
650
|
+
location = diskent.get('location', '')
|
651
|
+
if location.startswith('M.2'):
|
652
|
+
prefix = 'M.2-'
|
653
|
+
elif location.startswith('7MM'):
|
654
|
+
prefix = '7MM-'
|
635
655
|
diskname = 'Disk {1}{0}'.format(diskent['slotNo'], prefix)
|
636
656
|
bdata['model'] = diskent[
|
637
657
|
'productName'].rstrip()
|
@@ -708,12 +728,8 @@ class OEMHandler(generic.OEMHandler):
|
|
708
728
|
spares.append(diskinfo)
|
709
729
|
else:
|
710
730
|
disks.append(diskinfo)
|
711
|
-
totalsize = pool['totalCapacityStr']
|
712
|
-
|
713
|
-
totalsize = int(float(totalsize) * 1024)
|
714
|
-
freesize = pool['freeCapacityStr'].replace(
|
715
|
-
'GB', '').replace('GiB', '')
|
716
|
-
freesize = int(float(freesize) * 1024)
|
731
|
+
totalsize = str_to_size(pool['totalCapacityStr'])
|
732
|
+
freesize = str_to_size(pool['freeCapacityStr'])
|
717
733
|
pools.append(storage.Array(
|
718
734
|
disks=disks, raid=pool['rdlvlstr'], volumes=volumes,
|
719
735
|
id=(cid, pool['id']), hotspares=spares,
|
@@ -1262,10 +1278,15 @@ class OEMHandler(generic.OEMHandler):
|
|
1262
1278
|
complete = False
|
1263
1279
|
phase = "apply"
|
1264
1280
|
statetype = 'TaskState'
|
1265
|
-
|
1281
|
+
# sometimes we get an empty pgress when transitioning from the apply phase to
|
1282
|
+
# the validating phase; add a retry here so we don't exit the loop in this case
|
1283
|
+
retry = 3
|
1284
|
+
while not complete and retry > 0:
|
1266
1285
|
pgress = self._do_web_request(monitorurl, cache=False)
|
1267
1286
|
if not pgress:
|
1268
|
-
|
1287
|
+
retry -= 1
|
1288
|
+
time.sleep(3)
|
1289
|
+
continue
|
1269
1290
|
for msg in pgress.get('Messages', []):
|
1270
1291
|
if 'Verify failed' in msg.get('Message', ''):
|
1271
1292
|
raise Exception(msg['Message'])
|
@@ -1278,7 +1299,8 @@ class OEMHandler(generic.OEMHandler):
|
|
1278
1299
|
complete = state == 'Completed'
|
1279
1300
|
progress({'phase': phase, 'progress': pct})
|
1280
1301
|
if complete:
|
1281
|
-
|
1302
|
+
msgs = pgress.get('Messages', [])
|
1303
|
+
if msgs and 'OperationTransitionedToJob' in msgs[0].get('MessageId', ''):
|
1282
1304
|
monitorurl = pgress['Messages'][0]['MessageArgs'][0]
|
1283
1305
|
phase = 'validating'
|
1284
1306
|
statetype = 'JobState'
|
@@ -1816,8 +1838,12 @@ class OEMHandler(generic.OEMHandler):
|
|
1816
1838
|
|
1817
1839
|
def get_disk_hardware(self, diskent, prefix=''):
|
1818
1840
|
bdata = {}
|
1819
|
-
if not prefix
|
1820
|
-
|
1841
|
+
if not prefix:
|
1842
|
+
location = diskent.get('location', '')
|
1843
|
+
if location.startswith('M.2'):
|
1844
|
+
prefix = 'M.2-'
|
1845
|
+
elif location.startswith('7MM'):
|
1846
|
+
prefix = '7MM-'
|
1821
1847
|
diskname = 'Disk {1}{0}'.format(diskent['slotNo'], prefix)
|
1822
1848
|
bdata['Model'] = diskent['productName'].rstrip()
|
1823
1849
|
bdata['Serial Number'] = diskent['serialNo'].rstrip()
|
@@ -41,6 +41,7 @@ Steve Baker <sbaker@redhat.com>
|
|
41
41
|
Tim Rozet <trozet@redhat.com>
|
42
42
|
Tovin Seven <vinhnt@vn.fujitsu.com>
|
43
43
|
Vlad Spoiala <vspoiala1@lenovo.com>
|
44
|
+
Vlad Spoiala1 <vspoiala1@lenovo.com>
|
44
45
|
ghanshyam <gmann@ghanshyammann.com>
|
45
46
|
huang.zhiping <huang.zhiping@99cloud.net>
|
46
47
|
lijingxin <lijingxin@sinorail.com>
|
@@ -11,23 +11,23 @@ pyghmi/cmd/pyghmiutil.py,sha256=hir7FFvwKDNxYGpOPCgIVSgHP4UsVKFIbVBgBWqkBxA,2917
|
|
11
11
|
pyghmi/cmd/virshbmc.py,sha256=rNbRJrVnx5BmQQLVRV8JK3lW9YWUcP7Z8hCWfpfVLCM,5149
|
12
12
|
pyghmi/ipmi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
13
13
|
pyghmi/ipmi/bmc.py,sha256=LJBF90msq8xFcZSUe3s3jVcW02Ib-0Fc5zWvQNtGmcQ,7283
|
14
|
-
pyghmi/ipmi/command.py,sha256=
|
14
|
+
pyghmi/ipmi/command.py,sha256=1quCxG5K2jYr77JpYiGLwwOmt0xB2FPJ7T-axnMLTxU,90301
|
15
15
|
pyghmi/ipmi/console.py,sha256=Jle7uJI3ZQS6cMwbEisFEvXjmu5MVqMs17BcAlygR_4,23369
|
16
16
|
pyghmi/ipmi/events.py,sha256=zgUidJIARHomwxasgeYAzDO1AEMfEOzb6XVxzry22Us,22569
|
17
17
|
pyghmi/ipmi/fru.py,sha256=sw5ZBMrEVSBDgOUPVU_ksehQMJvrl2v-r7rVyA9xoiE,14430
|
18
18
|
pyghmi/ipmi/sdr.py,sha256=gXVai01amSxCO2rKOj74crMts1Hoi6pmbocWuik5sks,33009
|
19
19
|
pyghmi/ipmi/oem/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
20
|
-
pyghmi/ipmi/oem/generic.py,sha256=
|
20
|
+
pyghmi/ipmi/oem/generic.py,sha256=N-e-bfRxrxocTte9YqwLBDv65pbthn7h0_a15NlQ_Zc,18365
|
21
21
|
pyghmi/ipmi/oem/lookup.py,sha256=Ex00OEEolsdWCVhyP0QDGzOxHGEA7sKI8a8fW4kJPD8,3653
|
22
22
|
pyghmi/ipmi/oem/lenovo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
23
|
pyghmi/ipmi/oem/lenovo/config.py,sha256=1Ya23kc-7k-k05oLS7tj4jPyBoDtZaGzvr2Av1C-h7c,25694
|
24
24
|
pyghmi/ipmi/oem/lenovo/cpu.py,sha256=POZMP9n2S1v6r8iNStkCOVEiQYs3ut3RqL_9x-kgOFw,1651
|
25
25
|
pyghmi/ipmi/oem/lenovo/dimm.py,sha256=L8k1aBgtvxqyubDBNKdDkz80pDE8Sck1eMLcMz1GhFI,1875
|
26
26
|
pyghmi/ipmi/oem/lenovo/drive.py,sha256=MmVgaosEwJXcwi1kKYGnY-dbrx4Zp55941qWMvprUMA,2055
|
27
|
-
pyghmi/ipmi/oem/lenovo/energy.py,sha256=
|
27
|
+
pyghmi/ipmi/oem/lenovo/energy.py,sha256=f7_81HEq0vJFWPjb_cWuy5JNFiN2l6jZl3v2x9e_sCw,5902
|
28
28
|
pyghmi/ipmi/oem/lenovo/firmware.py,sha256=KS9uUBjFUzvdMw_e-kpr5sYIvFUaeg0yqyo69T94IVc,3747
|
29
29
|
pyghmi/ipmi/oem/lenovo/handler.py,sha256=BYfzauvGTGQ0hXFjsrpUXzyVRFzXsG8hfrkzp1vDqqI,56486
|
30
|
-
pyghmi/ipmi/oem/lenovo/imm.py,sha256=
|
30
|
+
pyghmi/ipmi/oem/lenovo/imm.py,sha256=C9kH7M3lOYW2z211Oz7KQZgiOAh6KjTjnyzZ6h_ZGeM,111156
|
31
31
|
pyghmi/ipmi/oem/lenovo/inventory.py,sha256=FLJJinw-ibdHtf3KmrTzhWXbQrpxq3TSycVf96Hg7cw,5911
|
32
32
|
pyghmi/ipmi/oem/lenovo/nextscale.py,sha256=g_PNjxPp9gS-ZaMYH-5Ng6_XURPocDZqIAXXWpmsNU4,43223
|
33
33
|
pyghmi/ipmi/oem/lenovo/pci.py,sha256=S7p-5Q2qu2YhlffN-LEmIvjfXim6OlfYL7Q6r6VZqJ4,2020
|
@@ -43,9 +43,9 @@ pyghmi/ipmi/private/simplesession.py,sha256=cNGaoT0uWIKDut6gUG9kAOX_b_qTzdB26R6I
|
|
43
43
|
pyghmi/ipmi/private/spd.py,sha256=oEPSXm19X2eNXDiyW_6fVjBFqhuuMAtBI9quRJgclH4,27094
|
44
44
|
pyghmi/ipmi/private/util.py,sha256=ayYodiSydlrrt0_pQppoRB1T6n-KNOiHZSfAlCMcpG0,3847
|
45
45
|
pyghmi/redfish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
46
|
-
pyghmi/redfish/command.py,sha256=
|
46
|
+
pyghmi/redfish/command.py,sha256=IlaWqtXwAaqk6Iaz0OHvUx5rcG5aYzanWv1gk7gAnUc,56834
|
47
47
|
pyghmi/redfish/oem/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
48
|
-
pyghmi/redfish/oem/generic.py,sha256=
|
48
|
+
pyghmi/redfish/oem/generic.py,sha256=LMqj1GkjCzaNfplG6fyN1gm6hbxbT-NwcqnezoVHXVc,39742
|
49
49
|
pyghmi/redfish/oem/lookup.py,sha256=pfJW5xSkUY61OirMeYy0b1SbjBFz6IDfN5ZOYog_Yq4,1530
|
50
50
|
pyghmi/redfish/oem/dell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
51
51
|
pyghmi/redfish/oem/dell/idrac.py,sha256=pNnmqdV1sOP3ABw0xq0wF1QEO2L8onT7Osc_-sDO8EU,2146
|
@@ -53,7 +53,7 @@ pyghmi/redfish/oem/dell/main.py,sha256=g8773SShUpbYxXB9zVx2pD5z1xP04wB_sXAxcAs6_
|
|
53
53
|
pyghmi/redfish/oem/lenovo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
54
54
|
pyghmi/redfish/oem/lenovo/main.py,sha256=eaCoePPXAw78BjKj9Ht7cqiXVGlj26Effy5_ybCnVDY,1622
|
55
55
|
pyghmi/redfish/oem/lenovo/tsma.py,sha256=puSj0fO5Dt5VpDoEMVTRY95CP9q18eXcAqq7TDK350E,34633
|
56
|
-
pyghmi/redfish/oem/lenovo/xcc.py,sha256=
|
56
|
+
pyghmi/redfish/oem/lenovo/xcc.py,sha256=5GMujnFfOdYN5rR1RURNrcojtYwCHf1T61XBaMv0Sa4,81876
|
57
57
|
pyghmi/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
58
58
|
pyghmi/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
59
59
|
pyghmi/tests/unit/base.py,sha256=xWImA7zPRgfrEe2xAdRZ6w_dLwExGRBJ5CBybssUQGg,744
|
@@ -62,11 +62,11 @@ pyghmi/tests/unit/ipmi/test_sdr.py,sha256=vb3iLY0cnHJ2K_m4xgYUjEcbPd_ZYhYx-uBowB
|
|
62
62
|
pyghmi/util/__init__.py,sha256=GZLBWJiun2Plb_VE9dDSh4_PQMCha3gA7QLUqx3oSYI,25
|
63
63
|
pyghmi/util/parse.py,sha256=6VlyBCEcE8gy8PJWmEDdtCyWATaKwPaTswCdioPCWOE,2120
|
64
64
|
pyghmi/util/webclient.py,sha256=jV091_s-HWNDVMKfMxB5XljqiwinQkfXJgHt1u6Umms,14526
|
65
|
-
pyghmi-1.5.
|
66
|
-
pyghmi-1.5.
|
67
|
-
pyghmi-1.5.
|
68
|
-
pyghmi-1.5.
|
69
|
-
pyghmi-1.5.
|
70
|
-
pyghmi-1.5.
|
71
|
-
pyghmi-1.5.
|
72
|
-
pyghmi-1.5.
|
65
|
+
pyghmi-1.5.66.dist-info/AUTHORS,sha256=-0iHKtdQwAJfAGKcruCnvcQXrXuE_LgBZ3P15DJI1xY,2044
|
66
|
+
pyghmi-1.5.66.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
67
|
+
pyghmi-1.5.66.dist-info/METADATA,sha256=OIW2wxKDLlwn_L1HPIG58VZRgd4oOc1Al73hqWhU2YQ,1119
|
68
|
+
pyghmi-1.5.66.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
|
69
|
+
pyghmi-1.5.66.dist-info/entry_points.txt,sha256=WkbeJkEZzG9MOILxkaEPSEQ109YP9euntH9kcxbysuk,169
|
70
|
+
pyghmi-1.5.66.dist-info/pbr.json,sha256=FJ2PFUdjU3Hr55bJHdhyFSMuRGMYMxtwbpavx_RuNw4,46
|
71
|
+
pyghmi-1.5.66.dist-info/top_level.txt,sha256=aDtt6S9eVu6-tNdaUs4Pz9PbdUd69bziZZMhNvk9Ulc,7
|
72
|
+
pyghmi-1.5.66.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
{"git_version": "4d6921c", "is_release": true}
|
pyghmi-1.5.64.dist-info/pbr.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"git_version": "b679122", "is_release": true}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|