pyghmi 1.5.70__py3-none-any.whl → 1.5.71__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 +2 -2
- pyghmi/ipmi/oem/lenovo/config.py +3 -1
- pyghmi/ipmi/oem/lenovo/handler.py +2 -2
- pyghmi/ipmi/oem/lenovo/imm.py +2 -2
- pyghmi/redfish/command.py +16 -5
- pyghmi/redfish/oem/generic.py +159 -41
- pyghmi/redfish/oem/lenovo/xcc.py +12 -5
- {pyghmi-1.5.70.dist-info → pyghmi-1.5.71.dist-info}/METADATA +1 -1
- {pyghmi-1.5.70.dist-info → pyghmi-1.5.71.dist-info}/RECORD +15 -15
- pyghmi-1.5.71.dist-info/pbr.json +1 -0
- pyghmi-1.5.70.dist-info/pbr.json +0 -1
- {pyghmi-1.5.70.dist-info → pyghmi-1.5.71.dist-info}/AUTHORS +0 -0
- {pyghmi-1.5.70.dist-info → pyghmi-1.5.71.dist-info}/LICENSE +0 -0
- {pyghmi-1.5.70.dist-info → pyghmi-1.5.71.dist-info}/WHEEL +0 -0
- {pyghmi-1.5.70.dist-info → pyghmi-1.5.71.dist-info}/entry_points.txt +0 -0
- {pyghmi-1.5.70.dist-info → pyghmi-1.5.71.dist-info}/top_level.txt +0 -0
pyghmi/ipmi/command.py
CHANGED
@@ -849,9 +849,9 @@ class Command(object):
|
|
849
849
|
else:
|
850
850
|
raise Exception("Unrecognized data format " + repr(fetchdata))
|
851
851
|
|
852
|
-
def get_extended_bmc_configuration(self):
|
852
|
+
def get_extended_bmc_configuration(self, hideadvanced=True):
|
853
853
|
self.oem_init()
|
854
|
-
return self._oem.get_extended_bmc_configuration()
|
854
|
+
return self._oem.get_extended_bmc_configuration(hideadvanced=hideadvanced)
|
855
855
|
|
856
856
|
def get_bmc_configuration(self):
|
857
857
|
self.oem_init()
|
pyghmi/ipmi/oem/lenovo/config.py
CHANGED
@@ -272,7 +272,9 @@ class LenovoFirmwareConfig(object):
|
|
272
272
|
cfgfilename = "config"
|
273
273
|
options = {}
|
274
274
|
data = None
|
275
|
-
if self.
|
275
|
+
if not hasattr(self.xc, 'grab_redfish_response_with_status'):
|
276
|
+
rsp = ({}, 500)
|
277
|
+
elif self.connection:
|
276
278
|
rsp = ({}, 200)
|
277
279
|
else:
|
278
280
|
rsp = self.xc.grab_redfish_response_with_status(
|
@@ -1194,9 +1194,9 @@ class OEMHandler(generic.OEMHandler):
|
|
1194
1194
|
return {'height': self._fpc_variant & 0xf, 'slot': 0}
|
1195
1195
|
return super(OEMHandler, self).get_description()
|
1196
1196
|
|
1197
|
-
def get_extended_bmc_configuration(self):
|
1197
|
+
def get_extended_bmc_configuration(self, hideadvanced=True):
|
1198
1198
|
if self.has_xcc:
|
1199
|
-
return self.immhandler.get_extended_bmc_configuration()
|
1199
|
+
return self.immhandler.get_extended_bmc_configuration(hideadvanced=hideadvanced)
|
1200
1200
|
return super(OEMHandler, self).get_extended_bmc_configuration()
|
1201
1201
|
|
1202
1202
|
def get_bmc_configuration(self):
|
pyghmi/ipmi/oem/lenovo/imm.py
CHANGED
@@ -978,8 +978,8 @@ class XCCClient(IMMClient):
|
|
978
978
|
return {}
|
979
979
|
return {'height': int(dsc['u-height']), 'slot': int(dsc['slot'])}
|
980
980
|
|
981
|
-
def get_extended_bmc_configuration(self):
|
982
|
-
immsettings = self.get_system_configuration(fetchimm=True)
|
981
|
+
def get_extended_bmc_configuration(self, hideadvanced=True):
|
982
|
+
immsettings = self.get_system_configuration(fetchimm=True, hideadvanced=hideadvanced)
|
983
983
|
for setting in list(immsettings):
|
984
984
|
if not setting.startswith('IMM.'):
|
985
985
|
del immsettings[setting]
|
pyghmi/redfish/command.py
CHANGED
@@ -789,6 +789,9 @@ class Command(object):
|
|
789
789
|
def get_health(self, verbose=True):
|
790
790
|
return self.oem.get_health(self, verbose)
|
791
791
|
|
792
|
+
def get_extended_bmc_configuration(self, hideadvanced=True):
|
793
|
+
return self.oem.get_extended_bmc_configuration(self, hideadvanced=hideadvanced)
|
794
|
+
|
792
795
|
def get_bmc_configuration(self):
|
793
796
|
"""Get miscellaneous BMC configuration
|
794
797
|
|
@@ -823,8 +826,16 @@ class Command(object):
|
|
823
826
|
In many cases, this may render remote network access impracticle or
|
824
827
|
impossible."
|
825
828
|
"""
|
829
|
+
bmcinfo = self._do_web_request(self._bmcurl)
|
830
|
+
rc = bmcinfo.get('Actions', {}).get('#Manager.ResetToDefaults', {})
|
831
|
+
actinf = rc.get('ResetType@Redfish.AllowableValues', [])
|
832
|
+
if 'ResetAll' in actinf:
|
833
|
+
acturl = actinf.get('target', None)
|
834
|
+
if acturl:
|
835
|
+
self._do_web_request(acturl, {'ResetType': 'ResetAll'})
|
836
|
+
return
|
826
837
|
raise exc.UnsupportedFunctionality(
|
827
|
-
'Clear BMC configuration not supported
|
838
|
+
'Clear BMC configuration not supported on this platform')
|
828
839
|
|
829
840
|
def get_system_configuration(self, hideadvanced=True):
|
830
841
|
return self.oem.get_system_configuration(hideadvanced, self)
|
@@ -1413,20 +1424,20 @@ class Command(object):
|
|
1413
1424
|
return self.oem.get_diagnostic_data(savefile, progress, autosuffix)
|
1414
1425
|
|
1415
1426
|
def get_licenses(self):
|
1416
|
-
return self.oem.get_licenses()
|
1427
|
+
return self.oem.get_licenses(self)
|
1417
1428
|
|
1418
1429
|
def delete_license(self, name):
|
1419
|
-
return self.oem.delete_license(name)
|
1430
|
+
return self.oem.delete_license(name, self)
|
1420
1431
|
|
1421
1432
|
def save_licenses(self, directory):
|
1422
1433
|
if os.path.exists(directory) and not os.path.isdir(directory):
|
1423
1434
|
raise exc.InvalidParameterValue(
|
1424
1435
|
'Not allowed to overwrite existing file: {0}'.format(
|
1425
1436
|
directory))
|
1426
|
-
return self.oem.save_licenses(directory)
|
1437
|
+
return self.oem.save_licenses(directory, self)
|
1427
1438
|
|
1428
1439
|
def apply_license(self, filename, progress=None, data=None):
|
1429
|
-
return self.oem.apply_license(filename, progress, data)
|
1440
|
+
return self.oem.apply_license(filename, self, progress, data)
|
1430
1441
|
|
1431
1442
|
|
1432
1443
|
if __name__ == '__main__':
|
pyghmi/redfish/oem/generic.py
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
import base64
|
15
16
|
from fnmatch import fnmatch
|
16
17
|
import json
|
17
18
|
import os
|
@@ -43,6 +44,11 @@ class SensorReading(object):
|
|
43
44
|
self.units = units
|
44
45
|
self.unavailable = unavailable
|
45
46
|
|
47
|
+
def _normalize_mac(mac):
|
48
|
+
if ':' not in mac:
|
49
|
+
mac = ':'.join((mac[:2], mac[2:4], mac[4:6], mac[6:8], mac[8:10], mac[10:12]))
|
50
|
+
return mac.lower()
|
51
|
+
|
46
52
|
_healthmap = {
|
47
53
|
'Critical': const.Health.Critical,
|
48
54
|
'Unknown': const.Health.Warning,
|
@@ -533,6 +539,12 @@ class OEMHandler(object):
|
|
533
539
|
'Model': self._varsysinfo.get(
|
534
540
|
'SKU', self._varsysinfo.get('PartNumber', '')),
|
535
541
|
}
|
542
|
+
if sysinfo['UUID'] and '-' not in sysinfo['UUID']:
|
543
|
+
sysinfo['UUID'] = '-'.join((
|
544
|
+
sysinfo['UUID'][:8], sysinfo['UUID'][8:12],
|
545
|
+
sysinfo['UUID'][12:16], sysinfo['UUID'][16:20],
|
546
|
+
sysinfo['UUID'][20:]))
|
547
|
+
sysinfo['UUID'] = sysinfo['UUID'].lower()
|
536
548
|
return sysinfo
|
537
549
|
else:
|
538
550
|
for invpair in self.get_inventory():
|
@@ -548,6 +560,12 @@ class OEMHandler(object):
|
|
548
560
|
'Model': self._varsysinfo.get(
|
549
561
|
'SKU', self._varsysinfo.get('PartNumber', '')),
|
550
562
|
}
|
563
|
+
if sysinfo['UUID'] and '-' not in sysinfo['UUID']:
|
564
|
+
sysinfo['UUID'] = '-'.join((
|
565
|
+
sysinfo['UUID'][:8], sysinfo['UUID'][8:12],
|
566
|
+
sysinfo['UUID'][12:16], sysinfo['UUID'][16:20],
|
567
|
+
sysinfo['UUID'][20:]))
|
568
|
+
sysinfo['UUID'] = sysinfo['UUID'].lower()
|
551
569
|
yield ('System', sysinfo)
|
552
570
|
self._hwnamemap = {}
|
553
571
|
cpumemurls = []
|
@@ -599,22 +617,39 @@ class OEMHandler(object):
|
|
599
617
|
yield (dname, ddata)
|
600
618
|
|
601
619
|
def _get_adp_inventory(self, onlyname=False, withids=False, urls=None):
|
620
|
+
foundmacs = False
|
621
|
+
macinfobyadpname = {}
|
622
|
+
if 'NetworkInterfaces' in self._varsysinfo:
|
623
|
+
nifurls = self._do_web_request(self._varsysinfo['NetworkInterfaces']['@odata.id'])
|
624
|
+
nifurls = nifurls.get('Members', [])
|
625
|
+
nifurls = [x['@odata.id'] for x in nifurls]
|
626
|
+
for nifurl in nifurls:
|
627
|
+
nifinfo = self._do_web_request(nifurl)
|
628
|
+
|
629
|
+
nadurl = nifinfo.get('Links', {}).get('NetworkAdapter', {}).get("@odata.id")
|
630
|
+
if nadurl:
|
631
|
+
nadinfo = self._do_web_request(nadurl)
|
632
|
+
if 'Name' not in nadinfo:
|
633
|
+
continue
|
634
|
+
nicname = nadinfo['Name']
|
635
|
+
yieldinf = {}
|
636
|
+
macidx = 1
|
637
|
+
for ctrlr in nadinfo.get('Controllers', []):
|
638
|
+
porturls = [x['@odata.id'] for x in ctrlr.get(
|
639
|
+
'Links', {}).get('Ports', [])]
|
640
|
+
for porturl in porturls:
|
641
|
+
portinfo = self._do_web_request(porturl)
|
642
|
+
macs = [x for x in portinfo.get(
|
643
|
+
'Ethernet', {}).get(
|
644
|
+
'AssociatedMACAddresses', [])]
|
645
|
+
for mac in macs:
|
646
|
+
label = 'MAC Address {}'.format(macidx)
|
647
|
+
yieldinf[label] = _normalize_mac(mac)
|
648
|
+
macidx += 1
|
649
|
+
foundmacs = True
|
650
|
+
macinfobyadpname[nicname] = yieldinf
|
602
651
|
if not urls:
|
603
652
|
urls = self._get_adp_urls()
|
604
|
-
if not urls:
|
605
|
-
# No PCIe device inventory, but *maybe* ethernet inventory...
|
606
|
-
aidx = 1
|
607
|
-
for nicinfo in self._get_eth_urls():
|
608
|
-
nicinfo = self._do_web_request(nicinfo)
|
609
|
-
nicname = nicinfo.get('Name', None)
|
610
|
-
nicinfo = nicinfo.get('MACAddress', None)
|
611
|
-
if not nicname:
|
612
|
-
nicname = 'NIC'
|
613
|
-
if nicinfo:
|
614
|
-
yield (nicname,
|
615
|
-
{'MAC Address {0}'.format(aidx): nicinfo})
|
616
|
-
aidx += 1
|
617
|
-
return
|
618
653
|
for inf in self._do_bulk_requests(urls):
|
619
654
|
adpinfo, url = inf
|
620
655
|
aname = adpinfo.get('Name', 'Unknown')
|
@@ -636,6 +671,8 @@ class OEMHandler(object):
|
|
636
671
|
yieldinf = {'Id': adpinfo.get('Id', aname)}
|
637
672
|
else:
|
638
673
|
yieldinf = {}
|
674
|
+
if aname in macinfobyadpname:
|
675
|
+
yieldinf.update(macinfobyadpname[aname])
|
639
676
|
funurls = [x['@odata.id'] for x in functions]
|
640
677
|
for fun in self._do_bulk_requests(funurls):
|
641
678
|
funinfo, url = fun
|
@@ -648,14 +685,42 @@ class OEMHandler(object):
|
|
648
685
|
yieldinf['PCI Subsystem Vendor ID'] = funinfo[
|
649
686
|
'SubsystemVendorId'].replace('0x', '')
|
650
687
|
yieldinf['Type'] = funinfo['DeviceClass']
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
688
|
+
if aname not in macinfobyadpname:
|
689
|
+
for nicinfo in funinfo.get('Links', {}).get(
|
690
|
+
'EthernetInterfaces', []):
|
691
|
+
nicinfo = self._do_web_request(nicinfo['@odata.id'])
|
692
|
+
macaddr = nicinfo.get('MACAddress', None)
|
693
|
+
if macaddr:
|
694
|
+
macaddr = _normalize_mac(macaddr)
|
695
|
+
foundmacs = True
|
696
|
+
yieldinf['MAC Address {0}'.format(nicidx)] = macaddr
|
697
|
+
nicidx += 1
|
698
|
+
if aname in macinfobyadpname:
|
699
|
+
del macinfobyadpname[aname]
|
658
700
|
yield aname, yieldinf
|
701
|
+
if macinfobyadpname:
|
702
|
+
for adp in macinfobyadpname:
|
703
|
+
yield adp, macinfobyadpname[adp]
|
704
|
+
if not foundmacs:
|
705
|
+
# No PCIe device inventory, but *maybe* ethernet inventory...
|
706
|
+
idxsbyname = {}
|
707
|
+
for nicinfo in self._get_eth_urls():
|
708
|
+
nicinfo = self._do_web_request(nicinfo)
|
709
|
+
nicname = nicinfo.get('Name', None)
|
710
|
+
nicinfo = nicinfo.get('MACAddress', nicinfo.get('PermanentAddress', None))
|
711
|
+
if nicinfo and ':' not in nicinfo:
|
712
|
+
nicinfo = ':'.join((
|
713
|
+
nicinfo[:2], nicinfo[2:4], nicinfo[4:6], nicinfo[6:8],
|
714
|
+
nicinfo[8:10], nicinfo[10:12]))
|
715
|
+
if not nicname:
|
716
|
+
nicname = 'NIC'
|
717
|
+
if nicinfo:
|
718
|
+
if nicname not in idxsbyname:
|
719
|
+
idxsbyname[nicname] = 0
|
720
|
+
idxsbyname[nicname] += 1
|
721
|
+
nicinfo = nicinfo.lower()
|
722
|
+
yield (nicname,
|
723
|
+
{'MAC Address {}'.format(idxsbyname[nicname]): nicinfo})
|
659
724
|
|
660
725
|
def _get_eth_urls(self):
|
661
726
|
ethurls = self._varsysinfo.get('EthernetInterfaces', {})
|
@@ -780,20 +845,24 @@ class OEMHandler(object):
|
|
780
845
|
|
781
846
|
def update_firmware(self, filename, data=None, progress=None, bank=None):
|
782
847
|
usd = self._do_web_request('/redfish/v1/UpdateService')
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
848
|
+
upurl = usd.get('MultipartHttpPushUri', None)
|
849
|
+
ismultipart = True
|
850
|
+
if not upurl:
|
851
|
+
ismultipart = False
|
852
|
+
if usd.get('HttpPushUriTargetsBusy', False):
|
853
|
+
raise exc.TemporaryError('Cannot run multtiple updates to '
|
854
|
+
'same target concurrently')
|
855
|
+
try:
|
856
|
+
upurl = usd['HttpPushUri']
|
857
|
+
except KeyError:
|
858
|
+
raise exc.UnsupportedFunctionality('Redfish firmware update only supported for implementations with push update support')
|
859
|
+
if 'HttpPushUriTargetsBusy' in usd:
|
860
|
+
self._do_web_request(
|
861
|
+
'/redfish/v1/UpdateService',
|
862
|
+
{'HttpPushUriTargetsBusy': True}, method='PATCH')
|
794
863
|
try:
|
795
864
|
uploadthread = webclient.FileUploader(
|
796
|
-
self.webclient, upurl, filename, data, formwrap=
|
865
|
+
self.webclient, upurl, filename, data, formwrap=ismultipart,
|
797
866
|
excepterror=False)
|
798
867
|
uploadthread.start()
|
799
868
|
wc = self.webclient
|
@@ -823,6 +892,7 @@ class OEMHandler(object):
|
|
823
892
|
# sometimes we get an empty pgress when transitioning from the apply phase to
|
824
893
|
# the validating phase; add a retry here so we don't exit the loop in this case
|
825
894
|
retry = 3
|
895
|
+
pct = 0.0
|
826
896
|
while not complete and retry > 0:
|
827
897
|
pgress = self._do_web_request(monitorurl, cache=False)
|
828
898
|
if not pgress:
|
@@ -837,7 +907,10 @@ class OEMHandler(object):
|
|
837
907
|
'Suspended'):
|
838
908
|
raise Exception(
|
839
909
|
json.dumps(json.dumps(pgress['Messages'])))
|
840
|
-
|
910
|
+
if 'PercentComplete' in pgress:
|
911
|
+
pct = float(pgress['PercentComplete'])
|
912
|
+
else:
|
913
|
+
print(repr(pgress))
|
841
914
|
complete = state == 'Completed'
|
842
915
|
progress({'phase': phase, 'progress': pct})
|
843
916
|
if complete:
|
@@ -910,17 +983,62 @@ class OEMHandler(object):
|
|
910
983
|
raise exc.UnsupportedFunctionality(
|
911
984
|
'Retrieving diagnostic data is not implemented for this platform')
|
912
985
|
|
913
|
-
def
|
914
|
-
|
986
|
+
def _get_license_collection_url(self, fishclient):
|
987
|
+
overview = fishclient._do_web_request('/redfish/v1/')
|
988
|
+
licsrv = overview.get('LicenseService', {}).get('@odata.id', None)
|
989
|
+
if not licsrv:
|
990
|
+
raise exc.UnsupportedFunctionality()
|
991
|
+
lcs = fishclient._do_web_request(licsrv)
|
992
|
+
licenses = lcs.get('Licenses', {}).get('@odata.id',None)
|
993
|
+
if not licenses:
|
994
|
+
raise exc.UnsupportedFunctionality()
|
995
|
+
return licenses
|
915
996
|
|
916
|
-
def
|
997
|
+
def get_extended_bmc_configuration(self, fishclient, hideadvanced=True):
|
917
998
|
raise exc.UnsupportedFunctionality()
|
918
999
|
|
919
|
-
def
|
920
|
-
|
1000
|
+
def _get_licenses(self, fishclient):
|
1001
|
+
licenses = self._get_license_collection_url(fishclient)
|
1002
|
+
collection = fishclient._do_web_request(licenses)
|
1003
|
+
alllic = [x['@odata.id'] for x in collection.get('Members', [])]
|
1004
|
+
for license in alllic:
|
1005
|
+
licdet = fishclient._do_web_request(license)
|
1006
|
+
state = licdet.get('Status', {}).get('State')
|
1007
|
+
if state != 'Enabled':
|
1008
|
+
continue
|
1009
|
+
yield licdet
|
921
1010
|
|
922
|
-
def
|
923
|
-
|
1011
|
+
def get_licenses(self, fishclient):
|
1012
|
+
for licdet in self._get_licenses(fishclient):
|
1013
|
+
name = licdet['Name']
|
1014
|
+
yield {'name': name, 'state': 'Active'}
|
1015
|
+
|
1016
|
+
def delete_license(self, name, fishclient):
|
1017
|
+
for licdet in self._get_licenses(fishclient):
|
1018
|
+
lname = licdet['Name']
|
1019
|
+
if name == lname:
|
1020
|
+
fishclient._do_web_request(licdet['@odata.id'], method='DELETE')
|
1021
|
+
|
1022
|
+
def save_licenses(self, directory, fishclient):
|
1023
|
+
for licdet in self._get_licenses(fishclient):
|
1024
|
+
dload = licdet.get('DownloadURI', None)
|
1025
|
+
if dload:
|
1026
|
+
filename = os.path.basename(dload)
|
1027
|
+
savefile = os.path.join(directory, filename)
|
1028
|
+
fd = webclient.FileDownloader(fishclient.wc, dload, savefile)
|
1029
|
+
fd.start()
|
1030
|
+
while fd.isAlive():
|
1031
|
+
fd.join(1)
|
1032
|
+
yield savefile
|
1033
|
+
|
1034
|
+
def apply_license(self, filename, fishclient, progress=None, data=None):
|
1035
|
+
licenses = self._get_license_collection_url(fishclient)
|
1036
|
+
if data is None:
|
1037
|
+
data = open(filename, 'rb')
|
1038
|
+
licdata = data.read()
|
1039
|
+
lic64 = base64.b64encode(licdata).decode()
|
1040
|
+
licinfo = {"LicenseString": lic64}
|
1041
|
+
fishclient._do_web_request(licenses, licinfo)
|
924
1042
|
|
925
1043
|
def get_user_expiration(self, uid):
|
926
1044
|
return None
|
pyghmi/redfish/oem/lenovo/xcc.py
CHANGED
@@ -149,6 +149,13 @@ class OEMHandler(generic.OEMHandler):
|
|
149
149
|
self.fwc = None
|
150
150
|
self.fwo = None
|
151
151
|
|
152
|
+
def get_extended_bmc_configuration(self, fishclient, hideadvanced=True):
|
153
|
+
immsettings = self.get_system_configuration(fetchimm=True, hideadvanced=hideadvanced)
|
154
|
+
for setting in list(immsettings):
|
155
|
+
if not setting.startswith('IMM.'):
|
156
|
+
del immsettings[setting]
|
157
|
+
return immsettings
|
158
|
+
|
152
159
|
def get_system_configuration(self, hideadvanced=True, fishclient=None,
|
153
160
|
fetchimm=False):
|
154
161
|
if not self.fwc:
|
@@ -1553,7 +1560,7 @@ class OEMHandler(generic.OEMHandler):
|
|
1553
1560
|
progress({'phase': 'complete'})
|
1554
1561
|
return savefile
|
1555
1562
|
|
1556
|
-
def get_licenses(self):
|
1563
|
+
def get_licenses(self, fishclient):
|
1557
1564
|
licdata = self.wc.grab_json_response('/api/providers/imm_fod')
|
1558
1565
|
for lic in licdata.get('items', [{}])[0].get('keys', []):
|
1559
1566
|
if lic['status'] == 0:
|
@@ -1564,7 +1571,7 @@ class OEMHandler(generic.OEMHandler):
|
|
1564
1571
|
'state': 'Missing required license'
|
1565
1572
|
}
|
1566
1573
|
|
1567
|
-
def delete_license(self, name):
|
1574
|
+
def delete_license(self, name, fishclient):
|
1568
1575
|
licdata = self.wc.grab_json_response('/api/providers/imm_fod')
|
1569
1576
|
for lic in licdata.get('items', [{}])[0].get('keys', []):
|
1570
1577
|
if lic.get('feature', None) == name:
|
@@ -1577,7 +1584,7 @@ class OEMHandler(generic.OEMHandler):
|
|
1577
1584
|
)
|
1578
1585
|
break
|
1579
1586
|
|
1580
|
-
def save_licenses(self, directory):
|
1587
|
+
def save_licenses(self, directory, fishclient):
|
1581
1588
|
licdata = self.wc.grab_json_response('/api/providers/imm_fod')
|
1582
1589
|
for lic in licdata.get('items', [{}])[0].get('keys', []):
|
1583
1590
|
licid = ','.join((str(lic['type']), str(lic['id'])))
|
@@ -1594,7 +1601,7 @@ class OEMHandler(generic.OEMHandler):
|
|
1594
1601
|
self._refresh_token()
|
1595
1602
|
yield savefile
|
1596
1603
|
|
1597
|
-
def apply_license(self, filename, progress=None, data=None):
|
1604
|
+
def apply_license(self, filename, fishclient, progress=None, data=None):
|
1598
1605
|
license_errors = {
|
1599
1606
|
310: "License is for a different model of system",
|
1600
1607
|
311: "License is for a different system serial number",
|
@@ -1618,7 +1625,7 @@ class OEMHandler(generic.OEMHandler):
|
|
1618
1625
|
if rsp.get('return', 0) in license_errors:
|
1619
1626
|
raise pygexc.InvalidParameterValue(
|
1620
1627
|
license_errors[rsp['return']])
|
1621
|
-
return self.get_licenses()
|
1628
|
+
return self.get_licenses(fishclient)
|
1622
1629
|
|
1623
1630
|
def user_delete(self, uid):
|
1624
1631
|
userinfo = self.wc.grab_json_response('/api/dataset/imm_users')
|
@@ -11,7 +11,7 @@ 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=DkqKeuicNL02JY2pQzZJwJLRvgH3Uakr5DKm0ElPFkY,90345
|
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
|
@@ -20,14 +20,14 @@ pyghmi/ipmi/oem/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
20
|
pyghmi/ipmi/oem/generic.py,sha256=HQ-9qTYIBpZqB1K75jTOTSUsirrKAQcI8BhLx0eAJ1g,18518
|
21
21
|
pyghmi/ipmi/oem/lookup.py,sha256=Ex00OEEolsdWCVhyP0QDGzOxHGEA7sKI8a8fW4kJPD8,3653
|
22
22
|
pyghmi/ipmi/oem/lenovo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
|
-
pyghmi/ipmi/oem/lenovo/config.py,sha256=
|
23
|
+
pyghmi/ipmi/oem/lenovo/config.py,sha256=jSA8_NACwzouLpAhsu591QQFaBYPEU7NHvhpEddLQpg,26105
|
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
27
|
pyghmi/ipmi/oem/lenovo/energy.py,sha256=THttIqlwpnj7ljbBWTHjelDLmDaQiCuMvNqJy9Ec7j8,6355
|
28
28
|
pyghmi/ipmi/oem/lenovo/firmware.py,sha256=KS9uUBjFUzvdMw_e-kpr5sYIvFUaeg0yqyo69T94IVc,3747
|
29
|
-
pyghmi/ipmi/oem/lenovo/handler.py,sha256=
|
30
|
-
pyghmi/ipmi/oem/lenovo/imm.py,sha256=
|
29
|
+
pyghmi/ipmi/oem/lenovo/handler.py,sha256=8OBkpxpPiwRFnBBCbs7RI4HtrdPT9k-cpZTEbAuuiG4,56536
|
30
|
+
pyghmi/ipmi/oem/lenovo/imm.py,sha256=2LFdzkTvgn4VaaXTHVazv6TTAosEAyIs77FMB6_fIBI,111202
|
31
31
|
pyghmi/ipmi/oem/lenovo/inventory.py,sha256=FLJJinw-ibdHtf3KmrTzhWXbQrpxq3TSycVf96Hg7cw,5911
|
32
32
|
pyghmi/ipmi/oem/lenovo/nextscale.py,sha256=ojLh17M87GnKUl-3yCTJcIJca1mpcrhlc7rQmhpby3A,43407
|
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=J0ERz9wL4fZiFdvTYh40R-7Jpeu9y64y4lfEd85Th9A,57812
|
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=IdrW3-mcmm3UxaPi7tqDt1dyOrdil4UhQH44bolxOiI,45363
|
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=MAJGAoOX-l5hMUiI7MXRsORPf0tGKWXWC8V1rDgb-KE,1665
|
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=2gdSBLImeXfjDSjsAuG-9gZtqHgDVY2q-9Y83hnhldE,82681
|
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.71.dist-info/AUTHORS,sha256=-0iHKtdQwAJfAGKcruCnvcQXrXuE_LgBZ3P15DJI1xY,2044
|
66
|
+
pyghmi-1.5.71.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
67
|
+
pyghmi-1.5.71.dist-info/METADATA,sha256=IQGGOG0v5PZfvPyDnI-a3ROlBgSM_aRs95F8V2TxdQ8,1119
|
68
|
+
pyghmi-1.5.71.dist-info/WHEEL,sha256=g4nMs7d-Xl9-xC9XovUrsDHGXt-FT0E17Yqo92DEfvY,92
|
69
|
+
pyghmi-1.5.71.dist-info/entry_points.txt,sha256=WkbeJkEZzG9MOILxkaEPSEQ109YP9euntH9kcxbysuk,169
|
70
|
+
pyghmi-1.5.71.dist-info/pbr.json,sha256=o1lc-M1LPkbdcU05-nGk-MCe5I5AeM0aKRDhjPlCY_8,46
|
71
|
+
pyghmi-1.5.71.dist-info/top_level.txt,sha256=aDtt6S9eVu6-tNdaUs4Pz9PbdUd69bziZZMhNvk9Ulc,7
|
72
|
+
pyghmi-1.5.71.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
{"git_version": "a8a0363", "is_release": true}
|
pyghmi-1.5.70.dist-info/pbr.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"git_version": "3673666", "is_release": true}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|