From 16096ad745731326b90af148944a0cc88ef482cc Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Thu, 25 Feb 2021 12:55:38 -0500 Subject: [PATCH] FD passing for firmware and media upload Extend use of client side file descriptors to media and firmmware upload. --- confluent_client/bin/nodefirmware | 6 ++++++ confluent_client/bin/nodelicense | 6 ++++++ confluent_client/bin/nodemedia | 6 ++++++ confluent_server/confluent/firmwaremanager.py | 19 +++++++++++++------ .../plugins/hardwaremanagement/ipmi.py | 5 +++-- .../plugins/hardwaremanagement/redfish.py | 6 ++++-- 6 files changed, 38 insertions(+), 10 deletions(-) diff --git a/confluent_client/bin/nodefirmware b/confluent_client/bin/nodefirmware index 20adb380..8f8ab62c 100755 --- a/confluent_client/bin/nodefirmware +++ b/confluent_client/bin/nodefirmware @@ -109,6 +109,12 @@ def update_firmware(session, filename): if options.backup: upargs['bank'] = 'backup' noderrs = {} + if session.unixdomain: + of = open(filename, 'rb') + try: + session.add_file(filename, of.fileno(), 'rb') + except Exception: + pass for res in session.create(resource, upargs): if 'created' not in res: for nodename in res.get('databynode', ()): diff --git a/confluent_client/bin/nodelicense b/confluent_client/bin/nodelicense index fe83281a..51573538 100755 --- a/confluent_client/bin/nodelicense +++ b/confluent_client/bin/nodelicense @@ -69,6 +69,12 @@ def install_license(session, filename): 'management_controller/licenses/'.format(noderange) filename = os.path.abspath(filename) instargs = {'filename': filename} + if session.unixdomain: + of = open(filename, 'rb') + try: + session.add_file(filename, of.fileno(), 'rb') + except Exception: + pass for res in session.create(resource, instargs): for node in res.get('databynode', []): if 'error' in res['databynode'][node]: diff --git a/confluent_client/bin/nodemedia b/confluent_client/bin/nodemedia index bb71a8f4..796274d0 100644 --- a/confluent_client/bin/nodemedia +++ b/confluent_client/bin/nodemedia @@ -111,6 +111,12 @@ def upload_media(noderange, media): resource = '/noderange/{0}/media/uploads/'.format(noderange) upargs = {'filename': filename} noderrs = {} + if session.unixdomain: + of = open(filename, 'rb') + try: + session.add_file(filename, of.fileno(), 'rb') + except Exception: + pass nodeurls = {} for res in session.create(resource, upargs): if 'created' not in res: diff --git a/confluent_server/confluent/firmwaremanager.py b/confluent_server/confluent/firmwaremanager.py index 626c0a38..96a4b9d2 100644 --- a/confluent_server/confluent/firmwaremanager.py +++ b/confluent_server/confluent/firmwaremanager.py @@ -32,11 +32,12 @@ uploadsbytarget = {} downloadsbytarget = {} updatepool = eventlet.greenpool.GreenPool(256) _tracelog = None +filecontentbyname = {} -def execupdate(handler, filename, updateobj, type, owner, node): +def execupdate(handler, filename, updateobj, type, owner, node, datfile): global _tracelog - if type != 'ffdc': + if type != 'ffdc' and not datfile: errstr = False if not os.path.exists(filename): errstr = '{0} does not appear to exist on {1}, or is in a directory with permissions forbidding confluent user/group access'.format( @@ -64,9 +65,10 @@ def execupdate(handler, filename, updateobj, type, owner, node): try: if type == 'firmware': completion = handler(filename, progress=updateobj.handle_progress, - bank=updateobj.bank) + data=datfile, bank=updateobj.bank) else: - completion = handler(filename, progress=updateobj.handle_progress) + completion = handler(filename, progress=updateobj.handle_progress, + data=datfile) if type == 'ffdc' and completion: filename = completion completion = None @@ -90,14 +92,19 @@ def execupdate(handler, filename, updateobj, type, owner, node): class Updater(object): def __init__(self, node, handler, filename, tenant=None, name=None, - bank=None, type='firmware', owner=None): + bank=None, type='firmware', owner=None, configmanager=None): self.bank = bank self.node = node self.phase = 'initializing' self.detail = '' self.percent = 0.0 + if configmanager and filename in configmanager.clientfiles: + cf = configmanager.clientfiles[filename] + datfile = os.fdopen(os.dup(cf.fileno()), cf.mode) + else: + datfile = None self.updateproc = updatepool.spawn(execupdate, handler, filename, - self, type, owner, node) + self, type, owner, node, datfile) if type == 'firmware': myparty = updatesbytarget elif type == 'mediaupload': diff --git a/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py b/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py index 7592a5fa..a309e8e8 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py @@ -462,6 +462,7 @@ persistent_ipmicmds = {} class IpmiHandler(object): def __init__(self, operation, node, element, cfd, inputdata, cfg, output, realop): + self.cfm = cfg self.invmap = {} self.output = output self.sensorcategory = None @@ -589,7 +590,7 @@ class IpmiHandler(object): def handle_update(self): u = firmwaremanager.Updater(self.node, self.ipmicmd.update_firmware, self.inputdata.nodefile(self.node), self.tenant, - bank=self.inputdata.bank) + bank=self.inputdata.bank, configmanager=self.cfm) self.output.put( msg.CreatedResource( 'nodes/{0}/inventory/firmware/updates/active/{1}'.format( @@ -598,7 +599,7 @@ class IpmiHandler(object): def handle_media_upload(self): u = firmwaremanager.Updater(self.node, self.ipmicmd.upload_media, self.inputdata.nodefile(self.node), self.tenant, - type='mediaupload') + type='mediaupload', configmanager=self.cfm) self.output.put(msg.CreatedResource( 'nodes/{0}/media/uploads/{1}'.format(self.node, u.name))) diff --git a/confluent_server/confluent/plugins/hardwaremanagement/redfish.py b/confluent_server/confluent/plugins/hardwaremanagement/redfish.py index 7d16d224..f5046858 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/redfish.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/redfish.py @@ -348,6 +348,7 @@ persistent_ipmicmds = {} class IpmiHandler(object): def __init__(self, operation, node, element, cfd, inputdata, cfg, output, realop): + self.cfm = cfg self.sensormap = {} self.invmap = {} self.output = output @@ -453,7 +454,8 @@ class IpmiHandler(object): def handle_update(self): u = firmwaremanager.Updater(self.node, self.ipmicmd.update_firmware, self.inputdata.nodefile(self.node), self.tenant, - bank=self.inputdata.bank) + bank=self.inputdata.bank, + configmanager=self.cfm) self.output.put( msg.CreatedResource( 'nodes/{0}/inventory/firmware/updates/active/{1}'.format( @@ -462,7 +464,7 @@ class IpmiHandler(object): def handle_media_upload(self): u = firmwaremanager.Updater(self.node, self.ipmicmd.upload_media, self.inputdata.nodefile(self.node), self.tenant, - type='mediaupload') + type='mediaupload', configmanager=self.cfm) self.output.put(msg.CreatedResource( 'nodes/{0}/media/uploads/{1}'.format(self.node, u.name)))