pyghmi 1.5.64__py3-none-any.whl → 1.5.66__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
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
 
@@ -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
 
@@ -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:
@@ -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) * 1024)
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 and diskent.get('location', '').startswith('M.2'):
1340
- prefix = 'M.2-'
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 and diskent.get('location', '').startswith('M.2'):
1351
- prefix = 'M.2-'
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
- while not complete:
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
- break
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
- if 'OperationTransitionedToJob' in pgress['Messages'][0]['MessageId']:
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]
@@ -820,10 +820,15 @@ class OEMHandler(object):
820
820
  complete = False
821
821
  phase = "apply"
822
822
  statetype = 'TaskState'
823
- while not complete:
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
- break
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
- if 'OperationTransitionedToJob' in pgress['Messages'][0]['MessageId']:
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'
@@ -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 and diskent.get('location', '').startswith('M.2'):
634
- prefix = 'M.2-'
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'].replace(
712
- 'GB', '').replace('GiB', '')
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
- while not complete:
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
- break
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
- if 'OperationTransitionedToJob' in pgress['Messages'][0]['MessageId']:
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 and diskent.get('location', '').startswith('M.2'):
1820
- prefix = 'M.2-'
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>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyghmi
3
- Version: 1.5.64
3
+ Version: 1.5.66
4
4
  Summary: Python General Hardware Management Initiative (IPMI and others)
5
5
  Home-page: http://github.com/openstack/pyghmi/
6
6
  Author: Jarrod Johnson
@@ -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=nbfFINT9TeSn2o2kZWyd5UDY9cvtkeTuVdAUY6O_VVE,89926
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=kR03DiYmFeHERv3-IOPgPXz0QDnZvj6wKbW-0FuXK2c,15150
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=nMT8M82lbHSU31ei3iFwFKUxKf-BdX0t9zO0yKezC6s,5869
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=fBnfyVVISI4UkTrSMTmbfh_Zwau0s-kltWY2eMJj8mw,110548
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=4vS9eVEpbk439bLW8od0RtBys_JG7-S90kah04YA9aE,54052
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=9u0cCZi7NRQYxOVQzgCxFHKr0WqeUV5J1MCJnxI0Syc,39399
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=OnH9l7s33od-v8t3LhumzFutp8cr12SNvHIKiO7pptM,80978
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.64.dist-info/AUTHORS,sha256=Y5fQrIX2SnPK6llV0RjxLtWUQk4PCaAnsGHXU74foik,2007
66
- pyghmi-1.5.64.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
67
- pyghmi-1.5.64.dist-info/METADATA,sha256=xneKUFtUKvbyjbQFSdO396pRNqwaVwbHAZoAgAxRwKw,1119
68
- pyghmi-1.5.64.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
69
- pyghmi-1.5.64.dist-info/entry_points.txt,sha256=WkbeJkEZzG9MOILxkaEPSEQ109YP9euntH9kcxbysuk,169
70
- pyghmi-1.5.64.dist-info/pbr.json,sha256=ALaJoJaPIKM7eFfKi8WE8CIJuzE7iXkL8ycJIAsqACE,46
71
- pyghmi-1.5.64.dist-info/top_level.txt,sha256=aDtt6S9eVu6-tNdaUs4Pz9PbdUd69bziZZMhNvk9Ulc,7
72
- pyghmi-1.5.64.dist-info/RECORD,,
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}
@@ -1 +0,0 @@
1
- {"git_version": "b679122", "is_release": true}