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
Autotest@test.kernel.org
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to