From fe7a1dbfe7581df701ed7f0532da3c328e04b38b Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Mon, 8 Dec 2025 16:17:16 -0500 Subject: [PATCH] Avoid media upload to duplicate target When uploading, check if filename already in use. Change-Id: Ia0d2bc163e6c143facad61df110808c8184ea210 --- pyghmi/ipmi/oem/lenovo/imm.py | 19 +++++++++++++++++-- pyghmi/redfish/oem/lenovo/xcc.py | 18 ++++++++++++++++-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/pyghmi/ipmi/oem/lenovo/imm.py b/pyghmi/ipmi/oem/lenovo/imm.py index f9559d37..35835059 100644 --- a/pyghmi/ipmi/oem/lenovo/imm.py +++ b/pyghmi/ipmi/oem/lenovo/imm.py @@ -1966,15 +1966,24 @@ class XCCClient(IMMClient): url = url.replace(':', '') url = 'nfs://' + url yield media.Media(mt['filename'], url) + for rdoc in self._list_rdoc(): + yield rdoc + self.weblogout() + + + def _list_rdoc(self): rt = self.wc.grab_json_response('/api/providers/rp_rdoc_imagelist') if 'items' in rt: for mt in rt['items']: yield media.Media(mt['filename']) - self.weblogout() def upload_media(self, filename, progress=None, data=None): wc = self.wc self._refresh_token() + for rdoc in self._list_rdoc(): + if rdoc.name == os.path.basename(filename): + raise pygexc.InvalidParameterValue( + 'An image with that name already exists') rsp, statu = wc.grab_json_response_with_status('/rdocupload') newmode = False if statu == 404: @@ -1999,10 +2008,16 @@ class XCCClient(IMMClient): progress({'phase': 'upload', 'progress': 100.0 * rsp['received'] / rsp['size']}) self._refresh_token() - rsp = json.loads(uploadthread.rsp) + if uploadthread.rsp: + rsp = json.loads(uploadthread.rsp) + else: + rsp = {} if progress: progress({'phase': 'upload', 'progress': 100.0}) + if 'items' not in rsp or len(rsp['items']) == 0: + errmsg = repr(rsp) if rsp else self.wc.lastjsonerror if self.wc.lastjsonerror else repr(uploadthread.rspstatus) + raise pygexc.PyghmiException('Failed to upload image: ' + errmsg) thepath = rsp['items'][0]['path'] thename = rsp['items'][0]['name'] writeable = 1 if filename.lower().endswith('.img') else 0 diff --git a/pyghmi/redfish/oem/lenovo/xcc.py b/pyghmi/redfish/oem/lenovo/xcc.py index a1f81089..b289be3e 100644 --- a/pyghmi/redfish/oem/lenovo/xcc.py +++ b/pyghmi/redfish/oem/lenovo/xcc.py @@ -1187,6 +1187,10 @@ class OEMHandler(generic.OEMHandler): url = url.replace(':', '') url = 'nfs://' + url yield media.Media(mt['filename'], url) + for rdoc in self._list_rdoc(): + yield rdoc + + def _list_rdoc(self): rt = self.wc.grab_json_response('/api/providers/rp_rdoc_imagelist') if 'items' in rt: for mt in rt['items']: @@ -1210,6 +1214,10 @@ class OEMHandler(generic.OEMHandler): def upload_media(self, filename, progress=None, data=None): wc = self.wc self._refresh_token() + for rdoc in self._list_rdoc(): + if rdoc.name == os.path.basename(filename): + raise pygexc.InvalidParameterValue( + 'An image with that name already exists') rsp, statu = wc.grab_json_response_with_status('/rdocupload') newmode = False if statu == 404: @@ -1234,10 +1242,16 @@ class OEMHandler(generic.OEMHandler): progress({'phase': 'upload', 'progress': 100.0 * rsp['received'] / rsp['size']}) self._refresh_token() - rsp = json.loads(uploadthread.rsp) + if uploadthread.rsp: + rsp = json.loads(uploadthread.rsp) + else: + rsp = {} if progress: progress({'phase': 'upload', 'progress': 100.0}) + if 'items' not in rsp or len(rsp['items']) == 0: + errmsg = repr(rsp) if rsp else self.wc.lastjsonerror if self.wc.lastjsonerror else repr(uploadthread.rspstatus) + raise pygexc.PyghmiException('Failed to upload image: ' + errmsg) thepath = rsp['items'][0]['path'] thename = rsp['items'][0]['name'] writeable = 1 if filename.lower().endswith('.img') else 0 @@ -1249,7 +1263,7 @@ class OEMHandler(generic.OEMHandler): self._refresh_token() if rsp.get('return', -1) != 0: errmsg = repr(rsp) if rsp else self.wc.lastjsonerror - raise Exception('Unrecognized return: ' + errmsg) + raise pygexc.PyghmiException('Failed to upload image: ' + errmsg) ready = False while not ready: time.sleep(3)