2
0
mirror of https://opendev.org/x/pyghmi synced 2026-04-12 13:01:29 +00:00

Avoid media upload to duplicate target

When uploading, check if filename already in use.

Change-Id: Ia0d2bc163e6c143facad61df110808c8184ea210
This commit is contained in:
Jarrod Johnson
2025-12-08 16:17:16 -05:00
parent 6a148fab5f
commit fe7a1dbfe7
2 changed files with 33 additions and 4 deletions

View File

@@ -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

View File

@@ -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)