On 07/12/2012 08:28 PM, Cleber Rosa wrote:
On 07/12/2012 08:14 PM, Nishanth Aravamudan wrote:On 12.07.2012 [20:05:14 -0300], Cleber Rosa wrote:On 07/12/2012 04:46 PM, Nishanth Aravamudan wrote:On 12.07.2012 [13:33:16 -0300], Cleber Rosa wrote:On 07/12/2012 08:55 AM, Cleber Rosa wrote:On 07/12/2012 05:07 AM, Nishanth Aravamudan wrote:On 12.07.2012 [00:20:04 -0700], Nishanth Aravamudan wrote:Hi all,After finally bothering to just put a proxy in place locally, I got grubby 8.15 to build, but it doesn't seem to make boottool happy :) 07/12 02:53:12 INFO | boottool:0667| Installing grubby because currently installed version (8.11) is not recent enough 07/12 02:53:18 DEBUG| boottool:0674| Installed: grubby version 8.15 07/12 02:53:18 ERROR| job:1338| JOB ERROR: Unhandled TypeError: sequence item 0: expected string, NoneType found Traceback (most recent call last): File "/usr/local/autotest/job.py", line 1089, in _run_step_fn exec('__ret = %s(*__args, **__dargs)' % fn, local_vars, local_vars) File "<string>", line 1, in <module> File "/usr/local/autotest/control.autoserv", line 16, in boot_kernel host.cleanup_kernels() File "/usr/local/autotest/shared/hosts/base_classes.py", line 655, in cleanup_kernels boot_info = self.bootloader.get_entries() File "/usr/local/autotest/tools/boottool.py", line 1150, in get_entries raw = self.get_info() File "/usr/local/autotest/tools/boottool.py", line 1180, in get_info info = self._run_grubby_get_output([command]) File "/usr/local/autotest/tools/boottool.py", line 835, in _run_grubby_get_output return self._run_get_output(args) File "/usr/local/autotest/tools/boottool.py", line 751, in _run_get_output ' '.join(arguments)) TypeError: sequence item 0: expected string, NoneType found 07/12 02:53:18 INFO | job:0210| END ABORT ---- ---- timestamp=1342075998 localtime=Jul 12 02:53:18 Unhandled TypeError: sequence item 0: expected string, NoneType found Traceback (most recent call last): File "/usr/local/autotest/job.py", line 1089, in _run_step_fn exec('__ret = %s(*__args, **__dargs)' % fn, local_vars, local_vars) File "<string>", line 1, in <module> File "/usr/local/autotest/control.autoserv", line 16, in boot_kernel host.cleanup_kernels() File "/usr/local/autotest/shared/hosts/base_classes.py", line 655, in cleanup_kernels boot_info = self.bootloader.get_entries() File "/usr/local/autotest/tools/boottool.py", line 1150, in get_entries raw = self.get_info() File "/usr/local/autotest/tools/boottool.py", line 1180, in get_info info = self._run_grubby_get_output([command]) File "/usr/local/autotest/tools/boottool.py", line 835, in _run_grubby_get_output return self._run_get_output(args) File "/usr/local/autotest/tools/boottool.py", line 751, in _run_get_output ' '.join(arguments)) TypeError: sequence item 0: expected string, NoneType found 07/12 02:53:18 DEBUG| base_job:0349| Persistent state client._record_indent now set to 0I won't claim to understand why it's happening, but I can tell a bit more about what's happening: Adding some hacks locally to _run_grubby_get_output, to print out the parameter arguments and the prepared return value args, I get: 04:01:35 INFO | Writing results to /usr/local/autotest/results/default 04:01:35 INFO | START ---- ---- timestamp=1342080095 localtime=Jul 12 04:01:35 04:01:36 INFO | arguments : ['--info=ALL'] 04:01:36 INFO | self.path = None 04:01:36 INFO | arguments : ['--version'] 04:01:36 INFO | self.path = /sbin/grubby 04:01:36 INFO | args : ['/sbin/grubby', '--version'] 04:01:36 INFO | arguments : ['--version'] 04:01:36 INFO | self.path = /sbin/grubby 04:01:36 INFO | args : ['/sbin/grubby', '--version'] 04:01:36 INFO | arguments : ['--version'] 04:01:36 INFO | self.path = /sbin/grubby 04:01:36 INFO | args : ['/sbin/grubby', '--version'] 04:01:36 INFO | args : [None, '--grub2', '--info=ALL'] 04:01:36 ERROR| JOB ERROR: Unhandled TypeError: sequence item 0: expected string, NoneType found So a couple of questions come to mind: 1) why do we call --version so many times?There's certainly room for optimizations here.2) AFAICT from my debugging, this is all coming from the one call to get_info(), but I don't see how self.path can be None.I've seen the same error when I had two grub entries with the same kernel and parameters set. I'm *guessiing* this is related to it, as your configuration also seems to be like that. I'm debugging that right now and will let you know about it.Nish, My first guess was actually incorrect. I've identified that the error is related to the laziness of the client/shared/boottool.py code when instantiating boottool, which inherits from Grubby. I've switched from the lazy approach to simply importing Grubby as boottool from the boottool_cli module:>from boottool_cli import Grubby as boottooland the error ceases to exist. I'm working on fixing that now.Something like the following? diff --git a/client/shared/boottool.py b/client/shared/boottool.py index 90f936b..05858d6 100644 --- a/client/shared/boottool.py +++ b/client/shared/boottool.py @@ -29,30 +29,4 @@ except ImportError: imp.load_source("boottool_cli", BOOTTOOL_CLI_PATH) -from boottool_cli import Grubby, install_grubby_if_necessary, EfiToolSys - - -class boottool(Grubby): - """ - Client site side boottool wrapper. - - Inherits all functionality from boottool(.py) CLI app (lazily). - """ - def __init__(self, path='/sbin/grubby'): - self.instantiated = False - self.path = path - - - def _init_on_demand(self): - if not self.instantiated: - try: - install_grubby_if_necessary() - Grubby.__init__(self, self.path) - self.instantiated = True - except Exception, e: - raise error.JobError("Unable to instantiate boottool: %s" % e) - - - def __getattr__(self, name): - self._init_on_demand() - return Grubby.__getattribute__(self, name) +from boottool_cli import Grubby as boottool, install_grubby_if_necessary, EfiToolSys This also seems to be working here.Yes, exactly. But the lazy instantiation was done on purpose, and we may not be able to get rid of it that easily. I'm doing some experimentation here to think about the best approach.Lacking the historical context, what was the purpose originally?Basically boiled down to avoiding triggering the grubby build/installation code whenever autotest.client.shared.boottool.boottool was instantiated. Code in job.py instantiate boottool.boottool quite early.
Now things look a lot clearer. If you look at: https://github.com/autotest/autotest/blob/master/client/job.py#L292you'll see boottool() is instantiated explicitly with the executable set to None.
I'm posting a patches that, among other things, fix this. Please give it a try! Thanks!!!
-Nish_______________________________________________ Autotest mailing list Autotest@test.kernel.org http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
_______________________________________________ Autotest mailing list Autotest@test.kernel.org http://test.kernel.org/cgi-bin/mailman/listinfo/autotest