On 13.07.2012 [17:54:53 -0700], Nishanth Aravamudan wrote:
> On 12.07.2012 [21:47:11 -0300], Cleber Rosa wrote:
> > 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 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.
> > 
> > Now things look a lot clearer. If you look at:
> > 
> > https://github.com/autotest/autotest/blob/master/client/job.py#L292
> > 
> > you'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!!!
> 
> Will revert the above diff and apply your 4 patches and let you know how
> it goes.

Seems to perform the same here, thanks!

If you want to use them:

Reported-by: Nishanth Aravamudan <n...@us.ibm.com>
Tested-by: Nishanth Aravamudan <n...@us.ibm.com>

-Nish

-- 
Nishanth Aravamudan <n...@us.ibm.com>
IBM Linux Technology Center

_______________________________________________
Autotest mailing list
Autotest@test.kernel.org
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to