mirror of
https://opendev.org/x/pyghmi
synced 2026-01-11 18:52:33 +00:00
Add generic redfish license handling
Use redfish standard mechanism for generic and starting point for redfish OEM support. Change-Id: I6ae8939c5b8f3a15a9b941a5a81f60438e7aa005
This commit is contained in:
@@ -1421,20 +1421,20 @@ class Command(object):
|
||||
return self.oem.get_diagnostic_data(savefile, progress, autosuffix)
|
||||
|
||||
def get_licenses(self):
|
||||
return self.oem.get_licenses()
|
||||
return self.oem.get_licenses(self)
|
||||
|
||||
def delete_license(self, name):
|
||||
return self.oem.delete_license(name)
|
||||
return self.oem.delete_license(name, self)
|
||||
|
||||
def save_licenses(self, directory):
|
||||
if os.path.exists(directory) and not os.path.isdir(directory):
|
||||
raise exc.InvalidParameterValue(
|
||||
'Not allowed to overwrite existing file: {0}'.format(
|
||||
directory))
|
||||
return self.oem.save_licenses(directory)
|
||||
return self.oem.save_licenses(directory, self)
|
||||
|
||||
def apply_license(self, filename, progress=None, data=None):
|
||||
return self.oem.apply_license(filename, progress, data)
|
||||
return self.oem.apply_license(filename, self, progress, data)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import base64
|
||||
from fnmatch import fnmatch
|
||||
import json
|
||||
import os
|
||||
@@ -982,17 +983,59 @@ class OEMHandler(object):
|
||||
raise exc.UnsupportedFunctionality(
|
||||
'Retrieving diagnostic data is not implemented for this platform')
|
||||
|
||||
def get_licenses(self):
|
||||
raise exc.UnsupportedFunctionality()
|
||||
def _get_license_collection_url(self, fishclient):
|
||||
overview = fishclient._do_web_request('/redfish/v1/')
|
||||
licsrv = overview.get('LicenseService', {}).get('@odata.id', None)
|
||||
if not licsrv:
|
||||
raise exc.UnsupportedFunctionality()
|
||||
lcs = fishclient._do_web_request(licsrv)
|
||||
licenses = lcs.get('Licenses', {}).get('@odata.id',None)
|
||||
if not licenses:
|
||||
raise exc.UnsupportedFunctionality()
|
||||
return licenses
|
||||
|
||||
def delete_license(self, name):
|
||||
raise exc.UnsupportedFunctionality()
|
||||
def _get_licenses(self, fishclient):
|
||||
licenses = self._get_license_collection_url(fishclient)
|
||||
collection = fishclient._do_web_request(licenses)
|
||||
alllic = [x['@odata.id'] for x in collection.get('Members', [])]
|
||||
for license in alllic:
|
||||
licdet = fishclient._do_web_request(license)
|
||||
state = licdet.get('Status', {}).get('State')
|
||||
if state != 'Enabled':
|
||||
continue
|
||||
yield licdet
|
||||
|
||||
def save_licenses(self, directory):
|
||||
raise exc.UnsupportedFunctionality()
|
||||
def get_licenses(self, fishclient):
|
||||
for licdet in self._get_licenses(fishclient):
|
||||
name = licdet['Name']
|
||||
yield {'name': name, 'state': 'Active'}
|
||||
|
||||
def apply_license(self, filename, progress=None, data=None):
|
||||
raise exc.UnsupportedFunctionality()
|
||||
def delete_license(self, name, fishclient):
|
||||
for licdet in self._get_licenses(fishclient):
|
||||
lname = licdet['Name']
|
||||
if name == lname:
|
||||
fishclient._do_web_request(licdet['@odata.id'], method='DELETE')
|
||||
|
||||
def save_licenses(self, directory, fishclient):
|
||||
for licdet in self._get_licenses(fishclient):
|
||||
dload = licdet.get('DownloadURI', None)
|
||||
if dload:
|
||||
filename = os.path.basename(dload)
|
||||
savefile = os.path.join(directory, filename)
|
||||
fd = webclient.FileDownloader(fishclient.wc, dload, savefile)
|
||||
fd.start()
|
||||
while fd.isAlive():
|
||||
fd.join(1)
|
||||
yield savefile
|
||||
|
||||
def apply_license(self, filename, fishclient, progress=None, data=None):
|
||||
licenses = self._get_license_collection_url(fishclient)
|
||||
if data is None:
|
||||
data = open(filename, 'rb')
|
||||
licdata = data.read()
|
||||
lic64 = base64.b64encode(licdata).decode()
|
||||
licinfo = {"LicenseString": lic64}
|
||||
fishclient._do_web_request(licenses, licinfo)
|
||||
|
||||
def get_user_expiration(self, uid):
|
||||
return None
|
||||
|
||||
@@ -1553,7 +1553,7 @@ class OEMHandler(generic.OEMHandler):
|
||||
progress({'phase': 'complete'})
|
||||
return savefile
|
||||
|
||||
def get_licenses(self):
|
||||
def get_licenses(self, fishclient):
|
||||
licdata = self.wc.grab_json_response('/api/providers/imm_fod')
|
||||
for lic in licdata.get('items', [{}])[0].get('keys', []):
|
||||
if lic['status'] == 0:
|
||||
@@ -1564,7 +1564,7 @@ class OEMHandler(generic.OEMHandler):
|
||||
'state': 'Missing required license'
|
||||
}
|
||||
|
||||
def delete_license(self, name):
|
||||
def delete_license(self, name, fishclient):
|
||||
licdata = self.wc.grab_json_response('/api/providers/imm_fod')
|
||||
for lic in licdata.get('items', [{}])[0].get('keys', []):
|
||||
if lic.get('feature', None) == name:
|
||||
@@ -1577,7 +1577,7 @@ class OEMHandler(generic.OEMHandler):
|
||||
)
|
||||
break
|
||||
|
||||
def save_licenses(self, directory):
|
||||
def save_licenses(self, directory, fishclient):
|
||||
licdata = self.wc.grab_json_response('/api/providers/imm_fod')
|
||||
for lic in licdata.get('items', [{}])[0].get('keys', []):
|
||||
licid = ','.join((str(lic['type']), str(lic['id'])))
|
||||
@@ -1594,7 +1594,7 @@ class OEMHandler(generic.OEMHandler):
|
||||
self._refresh_token()
|
||||
yield savefile
|
||||
|
||||
def apply_license(self, filename, progress=None, data=None):
|
||||
def apply_license(self, filename, fishclient, progress=None, data=None):
|
||||
license_errors = {
|
||||
310: "License is for a different model of system",
|
||||
311: "License is for a different system serial number",
|
||||
@@ -1618,7 +1618,7 @@ class OEMHandler(generic.OEMHandler):
|
||||
if rsp.get('return', 0) in license_errors:
|
||||
raise pygexc.InvalidParameterValue(
|
||||
license_errors[rsp['return']])
|
||||
return self.get_licenses()
|
||||
return self.get_licenses(fishclient)
|
||||
|
||||
def user_delete(self, uid):
|
||||
userinfo = self.wc.grab_json_response('/api/dataset/imm_users')
|
||||
|
||||
Reference in New Issue
Block a user