pyghmi 1.5.65__tar.gz → 1.5.67__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. {pyghmi-1.5.65 → pyghmi-1.5.67}/ChangeLog +11 -0
  2. {pyghmi-1.5.65 → pyghmi-1.5.67}/MANIFEST.in +1 -0
  3. {pyghmi-1.5.65 → pyghmi-1.5.67}/PKG-INFO +1 -1
  4. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/generic.py +3 -0
  5. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/imm.py +7 -2
  6. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/command.py +12 -2
  7. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/oem/generic.py +7 -2
  8. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/oem/lenovo/main.py +1 -1
  9. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/oem/lenovo/xcc.py +7 -2
  10. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi.egg-info/PKG-INFO +1 -1
  11. pyghmi-1.5.67/pyghmi.egg-info/pbr.json +1 -0
  12. pyghmi-1.5.65/pyghmi.egg-info/pbr.json +0 -1
  13. {pyghmi-1.5.65 → pyghmi-1.5.67}/.coveragerc +0 -0
  14. {pyghmi-1.5.65 → pyghmi-1.5.67}/.stestr.conf +0 -0
  15. {pyghmi-1.5.65 → pyghmi-1.5.67}/AUTHORS +0 -0
  16. {pyghmi-1.5.65 → pyghmi-1.5.67}/CONTRIBUTING.rst +0 -0
  17. {pyghmi-1.5.65 → pyghmi-1.5.67}/LICENSE +0 -0
  18. {pyghmi-1.5.65 → pyghmi-1.5.67}/README +0 -0
  19. {pyghmi-1.5.65 → pyghmi-1.5.67}/README.md +0 -0
  20. {pyghmi-1.5.65 → pyghmi-1.5.67}/builddeb +0 -0
  21. {pyghmi-1.5.65 → pyghmi-1.5.67}/buildrpm +0 -0
  22. {pyghmi-1.5.65 → pyghmi-1.5.67}/doc/requirements.txt +0 -0
  23. {pyghmi-1.5.65 → pyghmi-1.5.67}/doc/source/conf.py +0 -0
  24. {pyghmi-1.5.65 → pyghmi-1.5.67}/doc/source/contributor/index.rst +0 -0
  25. {pyghmi-1.5.65 → pyghmi-1.5.67}/doc/source/index.rst +0 -0
  26. {pyghmi-1.5.65 → pyghmi-1.5.67}/doc/source/install/index.rst +0 -0
  27. {pyghmi-1.5.65 → pyghmi-1.5.67}/doc/source/reference/index.rst +0 -0
  28. {pyghmi-1.5.65 → pyghmi-1.5.67}/makesetup +0 -0
  29. {pyghmi-1.5.65 → pyghmi-1.5.67}/playbooks/legacy/tempest-devstack-ironic-pxe_ipmitool-pyghmi-src/post.yaml +0 -0
  30. {pyghmi-1.5.65 → pyghmi-1.5.67}/playbooks/legacy/tempest-devstack-ironic-pxe_ipmitool-pyghmi-src/run.yaml +0 -0
  31. {pyghmi-1.5.65 → pyghmi-1.5.67}/py27-constraints.txt +0 -0
  32. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/__init__.py +0 -0
  33. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/cmd/__init__.py +0 -0
  34. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/cmd/fakebmc.py +0 -0
  35. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/cmd/pyghmicons.py +0 -0
  36. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/cmd/pyghmiutil.py +0 -0
  37. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/cmd/virshbmc.py +0 -0
  38. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/constants.py +0 -0
  39. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/exceptions.py +0 -0
  40. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/__init__.py +0 -0
  41. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/bmc.py +0 -0
  42. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/command.py +0 -0
  43. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/console.py +0 -0
  44. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/events.py +0 -0
  45. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/fru.py +0 -0
  46. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/__init__.py +0 -0
  47. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/__init__.py +0 -0
  48. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/config.py +0 -0
  49. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/cpu.py +0 -0
  50. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/dimm.py +0 -0
  51. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/drive.py +0 -0
  52. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/energy.py +0 -0
  53. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/firmware.py +0 -0
  54. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/handler.py +0 -0
  55. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/inventory.py +0 -0
  56. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/nextscale.py +0 -0
  57. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/pci.py +0 -0
  58. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/psu.py +0 -0
  59. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/raid_controller.py +0 -0
  60. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lenovo/raid_drive.py +0 -0
  61. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/oem/lookup.py +0 -0
  62. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/private/__init__.py +0 -0
  63. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/private/constants.py +0 -0
  64. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/private/localsession.py +0 -0
  65. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/private/serversession.py +0 -0
  66. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/private/session.py +0 -0
  67. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/private/simplesession.py +0 -0
  68. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/private/spd.py +0 -0
  69. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/private/util.py +0 -0
  70. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/ipmi/sdr.py +0 -0
  71. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/media.py +0 -0
  72. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/__init__.py +0 -0
  73. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/oem/__init__.py +0 -0
  74. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/oem/dell/__init__.py +0 -0
  75. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/oem/dell/idrac.py +0 -0
  76. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/oem/dell/main.py +0 -0
  77. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/oem/lenovo/__init__.py +0 -0
  78. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/oem/lenovo/tsma.py +0 -0
  79. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/redfish/oem/lookup.py +0 -0
  80. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/storage.py +0 -0
  81. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/tests/__init__.py +0 -0
  82. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/tests/unit/__init__.py +0 -0
  83. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/tests/unit/base.py +0 -0
  84. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/tests/unit/ipmi/__init__.py +0 -0
  85. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/tests/unit/ipmi/test_sdr.py +0 -0
  86. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/util/__init__.py +0 -0
  87. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/util/parse.py +0 -0
  88. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/util/webclient.py +0 -0
  89. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi/version.py +0 -0
  90. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi.egg-info/SOURCES.txt +0 -0
  91. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi.egg-info/dependency_links.txt +0 -0
  92. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi.egg-info/entry_points.txt +0 -0
  93. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi.egg-info/not-zip-safe +0 -0
  94. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi.egg-info/requires.txt +0 -0
  95. {pyghmi-1.5.65 → pyghmi-1.5.67}/pyghmi.egg-info/top_level.txt +0 -0
  96. {pyghmi-1.5.65 → pyghmi-1.5.67}/python-pyghmi.spec +0 -0
  97. {pyghmi-1.5.65 → pyghmi-1.5.67}/python-pyghmi.spec.tmpl +0 -0
  98. {pyghmi-1.5.65 → pyghmi-1.5.67}/requirements.txt +0 -0
  99. {pyghmi-1.5.65 → pyghmi-1.5.67}/setup.cfg +0 -0
  100. {pyghmi-1.5.65 → pyghmi-1.5.67}/setup.py +0 -0
  101. {pyghmi-1.5.65 → pyghmi-1.5.67}/setup.py.tmpl +0 -0
  102. {pyghmi-1.5.65 → pyghmi-1.5.67}/test-requirements.txt +0 -0
  103. {pyghmi-1.5.65 → pyghmi-1.5.67}/tox.ini +0 -0
  104. {pyghmi-1.5.65 → pyghmi-1.5.67}/wheezy.patch +0 -0
  105. {pyghmi-1.5.65 → pyghmi-1.5.67}/zuul.d/project.yaml +0 -0
@@ -1,6 +1,17 @@
1
1
  CHANGES
2
2
  =======
3
3
 
4
+ 1.5.67
5
+ ------
6
+
7
+ * Catch more XCC variants
8
+ * More gracefully fail on normalized readings
9
+
10
+ 1.5.66
11
+ ------
12
+
13
+ * Add retry mechanism to FW update
14
+
4
15
  1.5.65
5
16
  ------
6
17
 
@@ -1,4 +1,5 @@
1
1
  include AUTHORS
2
+ include LICENSE
2
3
  include ChangeLog
3
4
  exclude .gitignore
4
5
  exclude .gitreview
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.1
2
2
  Name: pyghmi
3
- Version: 1.5.65
3
+ Version: 1.5.67
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
@@ -115,6 +115,9 @@ class OEMHandler(object):
115
115
  if len(extenv) > 1:
116
116
  raise Exception('TODO: how to deal with multiple external environments')
117
117
  self._inlet_name = extenv[0]
118
+ if not self._inlet_name:
119
+ raise exc.UnsupportedFunctionality(
120
+ 'Unable to detect inlet sensor name for this platform')
118
121
  return ipmicmd.get_sensor_reading(self._inlet_name)
119
122
 
120
123
  def process_event(self, event, ipmicmd, seldata):
@@ -2062,13 +2062,18 @@ class XCCClient(IMMClient):
2062
2062
  complete = False
2063
2063
  phase = "apply"
2064
2064
  statetype = 'TaskState'
2065
- 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:
2066
2069
  pgress, status = self.grab_redfish_response_with_status(
2067
2070
  monitorurl)
2068
2071
  if status < 200 or status >= 300:
2069
2072
  raise Exception(pgress)
2070
2073
  if not pgress:
2071
- break
2074
+ retry -= 1
2075
+ ipmisession.Session.pause(3)
2076
+ continue
2072
2077
  for msg in pgress.get('Messages', []):
2073
2078
  if 'Verify failed' in msg.get('Message', ''):
2074
2079
  raise Exception(msg['Message'])
@@ -1153,6 +1153,8 @@ class Command(object):
1153
1153
  chassisurl = chassis['@odata.id']
1154
1154
  chassisinfo = self._do_web_request(chassisurl)
1155
1155
  envurl = chassisinfo.get('EnvironmentMetrics', {}).get('@odata.id', '')
1156
+ if not envurl:
1157
+ return {}
1156
1158
  envmetric = self._do_web_request(envurl, cache=1)
1157
1159
  retval = {
1158
1160
  'watts': envmetric.get('PowerWatts', {}).get('Reading', None),
@@ -1180,16 +1182,24 @@ class Command(object):
1180
1182
 
1181
1183
  def get_system_power_watts(self):
1182
1184
  totalwatts = 0
1185
+ gotpower = False
1183
1186
  for chassis in self.sysinfo.get('Links', {}).get('Chassis', []):
1184
1187
  envinfo = self._get_chassis_env(chassis)
1185
- totalwatts += envinfo['watts']
1188
+ currwatts = envinfo.get('watts', None)
1189
+ if currwatts is not None:
1190
+ gotpower = True
1191
+ totalwatts += envinfo['watts']
1192
+ if not gotpower:
1193
+ raise exc.UnsupportedFunctionality("System does not provide Power under redfish EnvironmentMetrics")
1186
1194
  return totalwatts
1187
1195
 
1188
1196
  def get_inlet_temperature(self):
1189
1197
  inlets = []
1190
1198
  for chassis in self.sysinfo.get('Links', {}).get('Chassis', []):
1191
1199
  envinfo = self._get_chassis_env(chassis)
1192
- inlets.append(envinfo['inlet'])
1200
+ currinlet = envinfo.get('inlet', None)
1201
+ if currinlet:
1202
+ inlets.append(currinlet)
1193
1203
  if inlets:
1194
1204
  val = sum(inlets) / len(inlets)
1195
1205
  unavail = False
@@ -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'])
@@ -23,7 +23,7 @@ def get_handler(sysinfo, sysurl, webclient, cache, cmd):
23
23
  bmcinfo = cmd.bmcinfo
24
24
  if 'Ami' in bmcinfo.get('Oem', {}):
25
25
  return tsma.TsmHandler(sysinfo, sysurl, webclient, cache)
26
- if 'FrontPanelUSB' in leninf or sysinfo.get('SKU', '').startswith('7X58'):
26
+ if 'FrontPanelUSB' in leninf or 'USBManagementPortAssignment' in leninf or sysinfo.get('SKU', '').startswith('7X58'):
27
27
  return xcc.OEMHandler(sysinfo, sysurl, webclient, cache,
28
28
  gpool=cmd._gpool)
29
29
  else:
@@ -1278,10 +1278,15 @@ class OEMHandler(generic.OEMHandler):
1278
1278
  complete = False
1279
1279
  phase = "apply"
1280
1280
  statetype = 'TaskState'
1281
- 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:
1282
1285
  pgress = self._do_web_request(monitorurl, cache=False)
1283
1286
  if not pgress:
1284
- break
1287
+ retry -= 1
1288
+ time.sleep(3)
1289
+ continue
1285
1290
  for msg in pgress.get('Messages', []):
1286
1291
  if 'Verify failed' in msg.get('Message', ''):
1287
1292
  raise Exception(msg['Message'])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.1
2
2
  Name: pyghmi
3
- Version: 1.5.65
3
+ Version: 1.5.67
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
@@ -0,0 +1 @@
1
+ {"git_version": "da7796b", "is_release": true}
@@ -1 +0,0 @@
1
- {"git_version": "3f38530", "is_release": true}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes