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 0
>>>>>> I 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 boottool
>>>> and 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.
> -Nish
>
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest