From: Leandro Lucarella Date: Mon, 12 Mar 2007 14:42:36 +0000 (+0000) Subject: Bugfix: no trata de guardar 2 veces el stdout/err, honra rechazar_si_falla y otros. X-Git-Tag: 0_9~39 X-Git-Url: https://git.llucax.com/software/sercom.git/commitdiff_plain/1b89907947b1f1ff3b5d2309e9451f5d6713eba7?ds=sidebyside;hp=ed0b50a76ff1027d10cf7bb00c504168f69fd06c Bugfix: no trata de guardar 2 veces el stdout/err, honra rechazar_si_falla y otros. También evita crear un zip vacío si no hay archivos_a_guardar y honra el Comando.terminar_si_falla. --- diff --git a/sercom/model.py b/sercom/model.py index 07ad64e..7b0f1f2 100644 --- a/sercom/model.py +++ b/sercom/model.py @@ -357,15 +357,6 @@ class Comando(InheritableSQLObject): #{{{ # son casos especiales activo = BoolCol(notNone=True, default=True) - def _get_guardar_stdout(self): - return self.STDOUT in self.archivos_a_guardar - - def _get_guardar_stderr(self): - return self.STDERR in self.archivos_a_guardar - - def _get_guardar_stdouterr(self): - return self.STDOUTERR in self.archivos_a_guardar - def __repr__(self, clave='', mas=''): return ('%s(%s comando=%s, descripcion=%s, retorno=%s, ' 'max_tiempo_cpu=%s, max_memoria=%s, max_tam_archivo=%s, ' diff --git a/sercom/tester.py b/sercom/tester.py index 47b3ec0..bf78038 100644 --- a/sercom/tester.py +++ b/sercom/tester.py @@ -330,17 +330,18 @@ def ejecutar_comando_fuente(self, path, entrega): #{{{ options['stdin'] = file('/tmp/sercom.tester.%s.stdin' % comando_ejecutado.id, 'r') # TODO else: options['preexec_fn'].close_stdin = True - if self.guardar_stdouterr: + a_guardar = set(self.archivos_a_guardar) + if self.STDOUTERR in a_guardar: options['stdout'] = file('/tmp/sercom.tester.%s.stdouterr' % comando_ejecutado.id, 'w') #TODO /var/run/sercom? options['stderr'] = sp.STDOUT else: - if self.guardar_stdout: + if self.STDOUT in a_guardar: options['stdout'] = file('/tmp/sercom.tester.%s.stdout' % comando_ejecutado.id, 'w') #TODO /run/lib/sercom? else: options['preexec_fn'].close_stdout = True - if self.guardar_stderr: + if self.STDERR in a_guardar: options['stderr'] = file('/tmp/sercom.tester.%s.stderr' % comando_ejecutado.id, 'w') #TODO /var/run/sercom? else: @@ -364,6 +365,8 @@ def ejecutar_comando_fuente(self, path, entrega): #{{{ if self.retorno != self.RET_ANY: if self.retorno == self.RET_FAIL: if proc.returncode == 0: + if self.rechazar_si_falla: + entrega.correcta = False comando_ejecutado.exito = False comando_ejecutado.observaciones += _(u'Se esperaba que el ' u'programa termine con un error (código de retorno ' @@ -373,6 +376,8 @@ def ejecutar_comando_fuente(self, path, entrega): #{{{ u'con un error (código de retorno distinto de 0) pero ' u'terminó bien (código de retorno 0).\n')) elif self.retorno != proc.returncode: + if self.rechazar_si_falla: + entrega.correcta = False comando_ejecutado.exito = False if proc.returncode < 0: comando_ejecutado.observaciones += _(u'Se esperaba terminar ' @@ -391,31 +396,41 @@ def ejecutar_comando_fuente(self, path, entrega): #{{{ if comando_ejecutado.exito is None: log.debug(_(u'Código de retorno OK')) comando_ejecutado.fin = datetime.now() - buffer = StringIO() - zip = ZipFile(buffer, 'w') - # Guardamos stdout/stderr - if self.guardar_stdouterr: - zip.write('/tmp/sercom.tester.%s.stdouterr' - % comando_ejecutado.id, '__stdouterr__') - else: - if self.guardar_stdout: - zip.write('/tmp/sercom.tester.%s.stdout' - % comando_ejecutado.id, '__stdout__') - if self.guardar_stderr: - zip.write('/tmp/sercom.tester.%s.stderr' - % comando_ejecutado.id, '__stderr__') - # Guardamos otros - for f in self.archivos_a_guardar: - if not os.path.exists(join(path, f)): - comando_ejecutado.exito = False - comando_ejecutado.observaciones += _(u'Se esperaba un archivo "%s" pero no fue ' - u'encontrado') % f - log.debug(_(u'Se esperaba un archivo "%s" pero no fue ' - u'encontrado'), f) + if a_guardar: + buffer = StringIO() + zip = ZipFile(buffer, 'w') + # Guardamos stdout/stderr + if self.STDOUTERR in a_guardar: + a_guardar.remove(self.STDOUTERR) + zip.write('/tmp/sercom.tester.%s.stdouterr' + % comando_ejecutado.id, '__stdouterr__') else: - zip.write(join(path, f), f) - zip.close() - comando_ejecutado.archivos_guardados = buffer.getvalue() + if self.STDOUT in a_guardar: + a_guardar.remove(self.STDOUT) + zip.write('/tmp/sercom.tester.%s.stdout' + % comando_ejecutado.id, '__stdout__') + if self.STDERR in a_guardar: + a_guardar.remove(self.STDERR) + zip.write('/tmp/sercom.tester.%s.stderr' + % comando_ejecutado.id, '__stderr__') + # Guardamos otros + for f in a_guardar: + if not os.path.exists(join(path, f)): + if self.rechazar_si_falla: + entrega.correcta = False + comando_ejecutado.exito = False + comando_ejecutado.observaciones += _(u'Se esperaba un archivo ' + u'"%s" pero no fue encontrado') % f + log.debug(_(u'Se esperaba un archivo "%s" pero no fue ' + u'encontrado'), f) + else: + zip.write(join(path, f), f) + zip.close() + comando_ejecutado.archivos_guardados = buffer.getvalue() + if comando_ejecutado.exito is None: + comando_ejecutado.exito = True + elif self.terminar_si_falla: + raise ExecutionFailure(self) # if no_anda_ejecucion: # TODO # comando_ejecutado.exito = False @@ -439,8 +454,6 @@ def ejecutar_comando_fuente(self, path, entrega): #{{{ # else: # comando_ejecutado.exito = True # comando_ejecutado.observaciones += 'xxx OK' # TODO - comando_ejecutado.exito = True - comando_ejecutado.observaciones += 'xxx OK' # TODO ComandoFuente.ejecutar = ejecutar_comando_fuente #}}}