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!!!

-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

Reply via email to