2
0
mirror of https://github.com/xcat2/confluent.git synced 2024-11-26 03:19:48 +00:00

Improve osdeploy import error handling

Before, conditions that were unexpected
would result in hangs.  Now
transition to and report error state.
This commit is contained in:
Jarrod Johnson 2022-01-14 09:23:54 -05:00
parent fdc3d1c457
commit 8b95e8f507
2 changed files with 39 additions and 10 deletions

View File

@ -409,6 +409,11 @@ def osimport(imagefile):
sys.stdout.write('\n')
for profile in rsp['profiles']:
print('Deployment profile created: {0}'.format(profile))
if rsp['phase'] == 'error':
sys.stderr.write('{0}\n'.format(rsp['error']))
if 'Permission denied' in rsp['error']:
sys.stderr.write('Confluent service unable to write to destination, check that confluent user has access to target\n')
return
sys.stdout.flush()
else:
print(repr(rsp))

View File

@ -567,7 +567,10 @@ def import_image(filename, callback, backend=False, mfd=None):
if identity.get('subname', None):
targpath += '/' + identity['subname']
targpath = '/var/lib/confluent/distributions/' + targpath
os.makedirs(targpath, 0o755)
try:
os.makedirs(targpath, 0o755)
except Exception as e:
sys.stdout.write('ERROR:{0}\r'.format(str(e)))
filename = os.path.abspath(filename)
identity['importedfile'] = filename
os.chdir(targpath)
@ -716,6 +719,7 @@ class MediaImporter(object):
raise Exception('{0} already exists'.format(self.targpath))
self.filename = os.path.abspath(media)
self.medfile = medfile
self.error = ''
self.importer = eventlet.spawn(self.importmedia)
def stop(self):
@ -724,7 +728,7 @@ class MediaImporter(object):
@property
def progress(self):
return {'phase': self.phase, 'progress': self.percent, 'profiles': self.profiles}
return {'phase': self.phase, 'progress': self.percent, 'profiles': self.profiles, 'error': self.error}
def importmedia(self):
os.environ['PYTHONPATH'] = ':'.join(sys.path)
@ -738,24 +742,44 @@ class MediaImporter(object):
while wkr.poll() is None:
currline += wkr.stdout.read(1)
if b'\r' in currline:
val = currline.split(b'%')[0].strip()
if val:
self.percent = float(val)
if b'%' in currline:
val = currline.split(b'%')[0].strip()
if val:
self.percent = float(val)
elif b'ERROR:' in currline:
self.error = currline.replace(b'ERROR:', b'')
if not isinstance(self.error, str):
self.error = self.error.decode('utf8')
self.phase = 'error'
self.percent = 100.0
return
currline = b''
a = wkr.stdout.read(1)
while a:
currline += a
if b'\r' in currline:
val = currline.split(b'%')[0].strip()
if val:
self.percent = float(val)
if b'%' in currline:
val = currline.split(b'%')[0].strip()
if val:
self.percent = float(val)
elif b'ERROR:' in currline:
self.error = currline.replace(b'ERROR:', b'')
if not isinstance(self.error, str):
self.error = self.error.decode('utf8')
self.phase = 'error'
return
currline = b''
a = wkr.stdout.read(1)
if self.oscategory:
defprofile = '/opt/confluent/lib/osdeploy/{0}'.format(
self.oscategory)
generate_stock_profiles(defprofile, self.distpath, self.targpath,
self.osname, self.profiles)
try:
generate_stock_profiles(defprofile, self.distpath, self.targpath,
self.osname, self.profiles)
except Exception as e:
self.phase = 'error'
self.error = str(e)
raise
self.phase = 'complete'
self.percent = 100.0