diff mbox series

[v3,1/5] lib/oeqa: share get_json_result_dir helper

Message ID 20240223151648.1453027-2-alexis.lothore@bootlin.com
State Accepted, archived
Commit 01b1a6a5a4e7cede4d23a981b5144ae9c8306274
Headers show
Series testimage: add failed test post actions and fetch more data | expand

Commit Message

Alexis Lothoré Feb. 23, 2024, 3:16 p.m. UTC
From: Alexis Lothoré <alexis.lothore@bootlin.com>

Multiple places in oeqa need to get the log output path, and redefine a
small helper to accomplish this

Define this helper in lib/oeqa/utils/__init__.py and import it wherever
needed to allow using it.

Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
---
There is one additional place re-definining (slightly) differently this
helper, which is in selftest/context.py. This one does not check
OEQA_JSON_RESULT_DIR from the datastore but through test data embedded in
the test context. Based on Richard's feedback in v2, the datastore
functions may be correctly simulated even in this case, so I may do some
tests and come up with a patch after this series
---
 meta/classes-recipe/testimage.bbclass | 12 +++---------
 meta/lib/oeqa/sdk/testsdk.py          | 11 ++---------
 meta/lib/oeqa/utils/__init__.py       |  7 +++++++
 3 files changed, 12 insertions(+), 18 deletions(-)

Comments

Richard Purdie Feb. 23, 2024, 5:27 p.m. UTC | #1
On Fri, 2024-02-23 at 16:16 +0100, Alexis Lothoré via
lists.openembedded.org wrote:
> From: Alexis Lothoré <alexis.lothore@bootlin.com>
> 
> Multiple places in oeqa need to get the log output path, and redefine
> a
> small helper to accomplish this
> 
> Define this helper in lib/oeqa/utils/__init__.py and import it
> wherever
> needed to allow using it.
> 
> Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
> ---
> There is one additional place re-definining (slightly) differently
> this
> helper, which is in selftest/context.py. This one does not check
> OEQA_JSON_RESULT_DIR from the datastore but through test data
> embedded in
> the test context. Based on Richard's feedback in v2, the datastore
> functions may be correctly simulated even in this case, so I may do
> some
> tests and come up with a patch after this series
> ---
>  meta/classes-recipe/testimage.bbclass | 12 +++---------
>  meta/lib/oeqa/sdk/testsdk.py          | 11 ++---------
>  meta/lib/oeqa/utils/__init__.py       |  7 +++++++
>  3 files changed, 12 insertions(+), 18 deletions(-)
> 
> diff --git a/meta/classes-recipe/testimage.bbclass b/meta/classes-
> recipe/testimage.bbclass
> index d076102f9691..959c226072aa 100644
> --- a/meta/classes-recipe/testimage.bbclass
> +++ b/meta/classes-recipe/testimage.bbclass
> @@ -149,13 +149,6 @@ def get_testimage_configuration(d, test_type,
> machine):
>      return configuration
>  get_testimage_configuration[vardepsexclude] = "DATETIME"
>  
> -def get_testimage_json_result_dir(d):
> -    json_result_dir = os.path.join(d.getVar("LOG_DIR"), 'oeqa')
> -    custom_json_result_dir = d.getVar("OEQA_JSON_RESULT_DIR")
> -    if custom_json_result_dir:
> -        json_result_dir = custom_json_result_dir
> -    return json_result_dir
> -
>  def get_testimage_result_id(configuration):
>      return '%s_%s_%s_%s' % (configuration['TEST_TYPE'],
> configuration['IMAGE_BASENAME'], configuration['MACHINE'],
> configuration['STARTTIME'])
>  
> @@ -224,6 +217,7 @@ def testimage_main(d):
>      from oeqa.core.target.qemu import supported_fstypes
>      from oeqa.core.utils.test import getSuiteCases
>      from oeqa.utils import make_logger_bitbake_compatible
> +    from oeqa.utils import get_json_result_dir
>  
>      def sigterm_exception(signum, stackframe):
>          """
> @@ -426,14 +420,14 @@ def testimage_main(d):
>      # Show results (if we have them)
>      if results:
>          configuration = get_testimage_configuration(d, 'runtime',
> machine)
> -        results.logDetails(get_testimage_json_result_dir(d),
> +        results.logDetails(get_json_result_dir(d),
>                          configuration,
>                          get_testimage_result_id(configuration),
>                         
> dump_streams=d.getVar('TESTREPORT_FULLLOGS'))
>          results.logSummary(pn)
>  
>      # Copy additional logs to tmp/log/oeqa so it's easier to find
> them
> -    targetdir = os.path.join(get_testimage_json_result_dir(d),
> d.getVar("PN"))
> +    targetdir = os.path.join(get_json_result_dir(d), d.getVar("PN"))
>      os.makedirs(targetdir, exist_ok=True)
>      os.symlink(bootlog, os.path.join(targetdir,
> os.path.basename(bootlog)))
>      os.symlink(d.getVar("BB_LOGFILE"), os.path.join(targetdir,
> os.path.basename(d.getVar("BB_LOGFILE") + "." +
> d.getVar('DATETIME'))))
> diff --git a/meta/lib/oeqa/sdk/testsdk.py
> b/meta/lib/oeqa/sdk/testsdk.py
> index b4719110edbc..518b09febb61 100644
> --- a/meta/lib/oeqa/sdk/testsdk.py
> +++ b/meta/lib/oeqa/sdk/testsdk.py
> @@ -22,14 +22,6 @@ class TestSDKBase(object):
>                          'LAYERS': get_layers(d.getVar("BBLAYERS"))}
>          return configuration
>  
> -    @staticmethod
> -    def get_sdk_json_result_dir(d):
> -        json_result_dir = os.path.join(d.getVar("LOG_DIR"), 'oeqa')
> -        custom_json_result_dir = d.getVar("OEQA_JSON_RESULT_DIR")
> -        if custom_json_result_dir:
> -            json_result_dir = custom_json_result_dir
> -        return json_result_dir
> -
>      @staticmethod
>      def get_sdk_result_id(configuration):
>          return '%s_%s_%s_%s_%s' % (configuration['TEST_TYPE'],
> configuration['IMAGE_BASENAME'], configuration['SDKMACHINE'],
> configuration['MACHINE'], configuration['STARTTIME'])
> @@ -72,6 +64,7 @@ class TestSDK(TestSDKBase):
>  
>          from bb.utils import export_proxies
>          from oeqa.utils import make_logger_bitbake_compatible
> +        from oeqa.utils import get_json_result_dir
>  
>          pn = d.getVar("PN")
>          logger =
> make_logger_bitbake_compatible(logging.getLogger("BitBake"))
> @@ -134,7 +127,7 @@ class TestSDK(TestSDKBase):
>              component = "%s %s" % (pn,
> self.context_executor_class.name)
>              context_msg = "%s:%s" % (os.path.basename(tcname),
> os.path.basename(sdk_env))
>              configuration = self.get_sdk_configuration(d,
> self.test_type)
> -            result.logDetails(self.get_sdk_json_result_dir(d),
> +            result.logDetails(get_json_result_dir(d),
>                              configuration,
>                              self.get_sdk_result_id(configuration))
>              result.logSummary(component, context_msg)
> diff --git a/meta/lib/oeqa/utils/__init__.py
> b/meta/lib/oeqa/utils/__init__.py
> index fbc7f7d525d8..53bdcbf26618 100644
> --- a/meta/lib/oeqa/utils/__init__.py
> +++ b/meta/lib/oeqa/utils/__init__.py
> @@ -90,3 +90,10 @@ def load_test_components(logger, executor):
>                                  "_executor_class defined." %
> (comp_name, comp_context))
>  
>      return components
> +
> +def get_json_result_dir(d):
> +    json_result_dir = os.path.join(d.getVar("LOG_DIR"), 'oeqa')
> +    custom_json_result_dir = d.getVar("OEQA_JSON_RESULT_DIR")
> +    if custom_json_result_dir:
> +        json_result_dir = custom_json_result_dir
> +    return json_result_dir
> \ No newline at end of file
> 

I suspect this is missing a change to TestSDKEXT:

https://autobuilder.yoctoproject.org/typhoon/#/builders/136/builds/56/steps/14/logs/stdio

Cheers,

Richard
Alexis Lothoré Feb. 23, 2024, 5:36 p.m. UTC | #2
On 2/23/24 18:27, Richard Purdie wrote:
> On Fri, 2024-02-23 at 16:16 +0100, Alexis Lothoré via
> lists.openembedded.org wrote:
>> From: Alexis Lothoré <alexis.lothore@bootlin.com>
>>
>> Multiple places in oeqa need to get the log output path, and redefine
>> a
>> small helper to accomplish this
>>
>> Define this helper in lib/oeqa/utils/__init__.py and import it
>> wherever
>> needed to allow using it.
>>
>> Signed-off-by: Alexis Lothoré <alexis.lothore@bootlin.com>
>> ---
>> There is one additional place re-definining (slightly) differently
>> this
>> helper, which is in selftest/context.py. This one does not check
>> OEQA_JSON_RESULT_DIR from the datastore but through test data
>> embedded in
>> the test context. Based on Richard's feedback in v2, the datastore
>> functions may be correctly simulated even in this case, so I may do
>> some
>> tests and come up with a patch after this series
>> ---
>>  meta/classes-recipe/testimage.bbclass | 12 +++---------
>>  meta/lib/oeqa/sdk/testsdk.py          | 11 ++---------
>>  meta/lib/oeqa/utils/__init__.py       |  7 +++++++
>>  3 files changed, 12 insertions(+), 18 deletions(-)
>>
>> diff --git a/meta/classes-recipe/testimage.bbclass b/meta/classes-
>> recipe/testimage.bbclass
>> index d076102f9691..959c226072aa 100644
>> --- a/meta/classes-recipe/testimage.bbclass
>> +++ b/meta/classes-recipe/testimage.bbclass
>> @@ -149,13 +149,6 @@ def get_testimage_configuration(d, test_type,
>> machine):
>>      return configuration
>>  get_testimage_configuration[vardepsexclude] = "DATETIME"
>>  
>> -def get_testimage_json_result_dir(d):
>> -    json_result_dir = os.path.join(d.getVar("LOG_DIR"), 'oeqa')
>> -    custom_json_result_dir = d.getVar("OEQA_JSON_RESULT_DIR")
>> -    if custom_json_result_dir:
>> -        json_result_dir = custom_json_result_dir
>> -    return json_result_dir
>> -
>>  def get_testimage_result_id(configuration):
>>      return '%s_%s_%s_%s' % (configuration['TEST_TYPE'],
>> configuration['IMAGE_BASENAME'], configuration['MACHINE'],
>> configuration['STARTTIME'])
>>  
>> @@ -224,6 +217,7 @@ def testimage_main(d):
>>      from oeqa.core.target.qemu import supported_fstypes
>>      from oeqa.core.utils.test import getSuiteCases
>>      from oeqa.utils import make_logger_bitbake_compatible
>> +    from oeqa.utils import get_json_result_dir
>>  
>>      def sigterm_exception(signum, stackframe):
>>          """
>> @@ -426,14 +420,14 @@ def testimage_main(d):
>>      # Show results (if we have them)
>>      if results:
>>          configuration = get_testimage_configuration(d, 'runtime',
>> machine)
>> -        results.logDetails(get_testimage_json_result_dir(d),
>> +        results.logDetails(get_json_result_dir(d),
>>                          configuration,
>>                          get_testimage_result_id(configuration),
>>                         
>> dump_streams=d.getVar('TESTREPORT_FULLLOGS'))
>>          results.logSummary(pn)
>>  
>>      # Copy additional logs to tmp/log/oeqa so it's easier to find
>> them
>> -    targetdir = os.path.join(get_testimage_json_result_dir(d),
>> d.getVar("PN"))
>> +    targetdir = os.path.join(get_json_result_dir(d), d.getVar("PN"))
>>      os.makedirs(targetdir, exist_ok=True)
>>      os.symlink(bootlog, os.path.join(targetdir,
>> os.path.basename(bootlog)))
>>      os.symlink(d.getVar("BB_LOGFILE"), os.path.join(targetdir,
>> os.path.basename(d.getVar("BB_LOGFILE") + "." +
>> d.getVar('DATETIME'))))
>> diff --git a/meta/lib/oeqa/sdk/testsdk.py
>> b/meta/lib/oeqa/sdk/testsdk.py
>> index b4719110edbc..518b09febb61 100644
>> --- a/meta/lib/oeqa/sdk/testsdk.py
>> +++ b/meta/lib/oeqa/sdk/testsdk.py
>> @@ -22,14 +22,6 @@ class TestSDKBase(object):
>>                          'LAYERS': get_layers(d.getVar("BBLAYERS"))}
>>          return configuration
>>  
>> -    @staticmethod
>> -    def get_sdk_json_result_dir(d):
>> -        json_result_dir = os.path.join(d.getVar("LOG_DIR"), 'oeqa')
>> -        custom_json_result_dir = d.getVar("OEQA_JSON_RESULT_DIR")
>> -        if custom_json_result_dir:
>> -            json_result_dir = custom_json_result_dir
>> -        return json_result_dir
>> -
>>      @staticmethod
>>      def get_sdk_result_id(configuration):
>>          return '%s_%s_%s_%s_%s' % (configuration['TEST_TYPE'],
>> configuration['IMAGE_BASENAME'], configuration['SDKMACHINE'],
>> configuration['MACHINE'], configuration['STARTTIME'])
>> @@ -72,6 +64,7 @@ class TestSDK(TestSDKBase):
>>  
>>          from bb.utils import export_proxies
>>          from oeqa.utils import make_logger_bitbake_compatible
>> +        from oeqa.utils import get_json_result_dir
>>  
>>          pn = d.getVar("PN")
>>          logger =
>> make_logger_bitbake_compatible(logging.getLogger("BitBake"))
>> @@ -134,7 +127,7 @@ class TestSDK(TestSDKBase):
>>              component = "%s %s" % (pn,
>> self.context_executor_class.name)
>>              context_msg = "%s:%s" % (os.path.basename(tcname),
>> os.path.basename(sdk_env))
>>              configuration = self.get_sdk_configuration(d,
>> self.test_type)
>> -            result.logDetails(self.get_sdk_json_result_dir(d),
>> +            result.logDetails(get_json_result_dir(d),
>>                              configuration,
>>                              self.get_sdk_result_id(configuration))
>>              result.logSummary(component, context_msg)
>> diff --git a/meta/lib/oeqa/utils/__init__.py
>> b/meta/lib/oeqa/utils/__init__.py
>> index fbc7f7d525d8..53bdcbf26618 100644
>> --- a/meta/lib/oeqa/utils/__init__.py
>> +++ b/meta/lib/oeqa/utils/__init__.py
>> @@ -90,3 +90,10 @@ def load_test_components(logger, executor):
>>                                  "_executor_class defined." %
>> (comp_name, comp_context))
>>  
>>      return components
>> +
>> +def get_json_result_dir(d):
>> +    json_result_dir = os.path.join(d.getVar("LOG_DIR"), 'oeqa')
>> +    custom_json_result_dir = d.getVar("OEQA_JSON_RESULT_DIR")
>> +    if custom_json_result_dir:
>> +        json_result_dir = custom_json_result_dir
>> +    return json_result_dir
>> \ No newline at end of file
>>
> 
> I suspect this is missing a change to TestSDKEXT:
> 
> https://autobuilder.yoctoproject.org/typhoon/#/builders/136/builds/56/steps/14/logs/stdio

Indeed, I messed up with some half-search-and-replace -_- Thanks for the test.
I'll delay a bit before sending v4 to avoid spamming the list.

Thanks,
Alexis
diff mbox series

Patch

diff --git a/meta/classes-recipe/testimage.bbclass b/meta/classes-recipe/testimage.bbclass
index d076102f9691..959c226072aa 100644
--- a/meta/classes-recipe/testimage.bbclass
+++ b/meta/classes-recipe/testimage.bbclass
@@ -149,13 +149,6 @@  def get_testimage_configuration(d, test_type, machine):
     return configuration
 get_testimage_configuration[vardepsexclude] = "DATETIME"
 
-def get_testimage_json_result_dir(d):
-    json_result_dir = os.path.join(d.getVar("LOG_DIR"), 'oeqa')
-    custom_json_result_dir = d.getVar("OEQA_JSON_RESULT_DIR")
-    if custom_json_result_dir:
-        json_result_dir = custom_json_result_dir
-    return json_result_dir
-
 def get_testimage_result_id(configuration):
     return '%s_%s_%s_%s' % (configuration['TEST_TYPE'], configuration['IMAGE_BASENAME'], configuration['MACHINE'], configuration['STARTTIME'])
 
@@ -224,6 +217,7 @@  def testimage_main(d):
     from oeqa.core.target.qemu import supported_fstypes
     from oeqa.core.utils.test import getSuiteCases
     from oeqa.utils import make_logger_bitbake_compatible
+    from oeqa.utils import get_json_result_dir
 
     def sigterm_exception(signum, stackframe):
         """
@@ -426,14 +420,14 @@  def testimage_main(d):
     # Show results (if we have them)
     if results:
         configuration = get_testimage_configuration(d, 'runtime', machine)
-        results.logDetails(get_testimage_json_result_dir(d),
+        results.logDetails(get_json_result_dir(d),
                         configuration,
                         get_testimage_result_id(configuration),
                         dump_streams=d.getVar('TESTREPORT_FULLLOGS'))
         results.logSummary(pn)
 
     # Copy additional logs to tmp/log/oeqa so it's easier to find them
-    targetdir = os.path.join(get_testimage_json_result_dir(d), d.getVar("PN"))
+    targetdir = os.path.join(get_json_result_dir(d), d.getVar("PN"))
     os.makedirs(targetdir, exist_ok=True)
     os.symlink(bootlog, os.path.join(targetdir, os.path.basename(bootlog)))
     os.symlink(d.getVar("BB_LOGFILE"), os.path.join(targetdir, os.path.basename(d.getVar("BB_LOGFILE") + "." + d.getVar('DATETIME'))))
diff --git a/meta/lib/oeqa/sdk/testsdk.py b/meta/lib/oeqa/sdk/testsdk.py
index b4719110edbc..518b09febb61 100644
--- a/meta/lib/oeqa/sdk/testsdk.py
+++ b/meta/lib/oeqa/sdk/testsdk.py
@@ -22,14 +22,6 @@  class TestSDKBase(object):
                         'LAYERS': get_layers(d.getVar("BBLAYERS"))}
         return configuration
 
-    @staticmethod
-    def get_sdk_json_result_dir(d):
-        json_result_dir = os.path.join(d.getVar("LOG_DIR"), 'oeqa')
-        custom_json_result_dir = d.getVar("OEQA_JSON_RESULT_DIR")
-        if custom_json_result_dir:
-            json_result_dir = custom_json_result_dir
-        return json_result_dir
-
     @staticmethod
     def get_sdk_result_id(configuration):
         return '%s_%s_%s_%s_%s' % (configuration['TEST_TYPE'], configuration['IMAGE_BASENAME'], configuration['SDKMACHINE'], configuration['MACHINE'], configuration['STARTTIME'])
@@ -72,6 +64,7 @@  class TestSDK(TestSDKBase):
 
         from bb.utils import export_proxies
         from oeqa.utils import make_logger_bitbake_compatible
+        from oeqa.utils import get_json_result_dir
 
         pn = d.getVar("PN")
         logger = make_logger_bitbake_compatible(logging.getLogger("BitBake"))
@@ -134,7 +127,7 @@  class TestSDK(TestSDKBase):
             component = "%s %s" % (pn, self.context_executor_class.name)
             context_msg = "%s:%s" % (os.path.basename(tcname), os.path.basename(sdk_env))
             configuration = self.get_sdk_configuration(d, self.test_type)
-            result.logDetails(self.get_sdk_json_result_dir(d),
+            result.logDetails(get_json_result_dir(d),
                             configuration,
                             self.get_sdk_result_id(configuration))
             result.logSummary(component, context_msg)
diff --git a/meta/lib/oeqa/utils/__init__.py b/meta/lib/oeqa/utils/__init__.py
index fbc7f7d525d8..53bdcbf26618 100644
--- a/meta/lib/oeqa/utils/__init__.py
+++ b/meta/lib/oeqa/utils/__init__.py
@@ -90,3 +90,10 @@  def load_test_components(logger, executor):
                                 "_executor_class defined." % (comp_name, comp_context))
 
     return components
+
+def get_json_result_dir(d):
+    json_result_dir = os.path.join(d.getVar("LOG_DIR"), 'oeqa')
+    custom_json_result_dir = d.getVar("OEQA_JSON_RESULT_DIR")
+    if custom_json_result_dir:
+        json_result_dir = custom_json_result_dir
+    return json_result_dir
\ No newline at end of file