Is there a good tool that you use to generate this patch email?  I'm
generating it by hand with git diff and there must be a better way.
Thanks,
Mike

We wanted to have a little more flexibility with test_importer.py for
chromeos.  For example we wanted to import
all tests from client/site_tests and server/site_tests but only some from
client/tests and server/tests.
We've added the following:
-The ability to pass a whitelist with -w that specifies a subset of tests
within a tests/profilers/samples directory.
 This option is incompatible with -a because if you're using -a you're
probably already managing your tests by
 adding/deleting files.  There is a subtle implication that if you specify
-c, -t and -w (we do) tests under the
 tests_dir not in the whitelist will be cleaned (we want this).  We have not
created a site_test_importer.sh
 that individually calls test_importer.py 4 different times with '-c -t
client/tests -w file', '-t client/site_tests',
 '-t server/tests -w file' and '-t server/site_tests'.
-The ability to adjust any test attributes as a site-specific extension.  We
will use the file site_set_attributes.py
 if it exists and it should include  the function: 'def
_set_attributes_custom(test, data)'.
 We use this to adjust the following:
 -Use the directory name instead of control-file NAME (handles multiple
control files (control.xx) as dirname.xx.
 -Globally set run_verify to 0

diff --git a/utils/test_importer.py b/utils/test_importer.py
index 4074a8e..b392366 100755
--- a/utils/test_importer.py
+++ b/utils/test_importer.py
@@ -30,7 +30,7 @@ import common
 import logging, re, os, sys, optparse, compiler
 from autotest_lib.frontend import setup_django_environment
 from autotest_lib.frontend.afe import models
-from autotest_lib.client.common_lib import control_data
+from autotest_lib.client.common_lib import control_data, utils


 logging.basicConfig(level=logging.DEBUG)
@@ -78,7 +78,8 @@ def update_all(autotest_dir, add_noncompliant,
add_experimental, verbose):
     db_clean_broken(autotest_dir, verbose)


-def update_samples(autotest_dir, add_noncompliant, add_experimental,
verbose):
+def update_samples(autotest_dir, add_noncompliant, add_experimental,
+                   verbose, whitelist_set=None):
     sample_path = os.path.join(autotest_dir, 'server/samples')
     if os.path.exists(sample_path):
         if verbose:
@@ -88,7 +89,7 @@ def update_samples(autotest_dir, add_noncompliant,
add_experimental, verbose):
         update_tests_in_db(tests, add_experimental=add_experimental,
                            add_noncompliant=add_noncompliant,
                            autotest_dir=autotest_dir,
-                           verbose=verbose)
+                           verbose=verbose, whitelist_set=whitelist_set)


 def db_clean_broken(autotest_dir, verbose):
@@ -114,10 +115,46 @@ def db_clean_broken(autotest_dir, verbose):
             _log_or_execute(repr(profiler), profiler.delete)


+def db_clean_from_whitelist(autotest_dir, verbose,
+                            tests_dir, whitelist_set):
+    """Remove tests from autotest_web which are under tests_dir but
+       not called out by the whitelist.
+
+       Arguments:
+        autotest_dir: base directory
+        verbose: for logging
+        tests_dir: to filter tests
+        whitelist_set: to filter tests
+    """
+    tests_dir_len = len(tests_dir)
+    for test in models.Test.objects.all():
+        full_path = os.path.join(autotest_dir, test.path)
+        if full_path[:tests_dir_len] == tests_dir:
+            if not (full_path + '\n') in whitelist_set:
+                if verbose:
+                    print "Removing %s - not in whitelist" % (test.path)
+                _log_or_execute(repr(test), test.delete)
+
+    # Find profilers that are no longer present
+    if os.path.join("client", "profilers") == tests_dir:
+        for profiler in models.Profiler.objects.all():
+            full_path = os.path.join(autotest_dir, "client", "profilers",
+                                 profiler.name)
+            if not full_path in whitelist_set:
+                if verbose:
+                    print "Removing %s - not in whitelist" % (test.path)
+                _log_or_execute(repr(profiler), profiler.delete)
+
+
 def update_profilers_in_db(profilers, verbose=False, description='NA',
-                           add_noncompliant=False):
+                           add_noncompliant=False, whitelist_set=None):
     """Update profilers in autotest_web database"""
     for profiler in profilers:
+        if whitelist_set and not (profiler + '\n') in whitelist_set:
+            if verbose:
+                print "Skipping %s - not on whitelist" % (profiler)
+            continue
+
         name = os.path.basename(profiler).rstrip(".py")
         if not profilers[profiler]:
             if add_noncompliant:
@@ -134,9 +171,17 @@ def update_profilers_in_db(profilers, verbose=False,
description='NA',

 def update_tests_in_db(tests, dry_run=False, add_experimental=False,
                        add_noncompliant=False, verbose=False,
-                       autotest_dir=None):
+                       autotest_dir=None, whitelist_set=None):
     """Update or add each test to the database"""
+    site_set_attributes_module = utils.import_site_module(
+        __file__, 'autotest_lib.utils.site_set_attributes')
+
     for test in tests:
+        if whitelist_set and not (test + '\n') in whitelist_set:
+            if verbose:
+                print "Skipping %s - not on whitelist" % (test)
+            continue
+
         new_test = models.Test.objects.get_or_create(
                 path=test.replace(autotest_dir, '').lstrip('/'))[0]
         if verbose:
@@ -146,6 +191,10 @@ def update_tests_in_db(tests, dry_run=False,
add_experimental=False,
         data = tests[test]
         _set_attributes_clean(new_test, data)

+        # Custom Attribute Update
+        if site_set_attributes_module:
+            site_set_attributes_module._set_attributes_custom(new_test,
data)
+
         # This only takes place if --add-noncompliant is provided on the
CLI
         if not new_test.name:
             test_new_test = test.split('/')
@@ -346,6 +395,8 @@ def main(argv):
     parser.add_option('-v', '--verbose',
                       dest='verbose', action='store_true', default=False,
                       help='Run in verbose mode')
+    parser.add_option('-w', '--whitelist-file', dest='whitelist_file',
+                      help='Filename for list of test names that must
match')
     parser.add_option('-z', '--autotest_dir', dest='autotest_dir',
                       default=os.path.join(os.path.dirname(__file__),
'..'),
                       help='Autotest directory root')
@@ -365,14 +416,29 @@ def main(argv):
         db_clean_broken(options.autotest_dir, options.verbose)
         return 0

+    whitelist_set = None
+    if options.whitelist_file:
+        if options.add_all:
+            print "Cannot pass both --add-all and --whitelist-file"
+            return 1
+        whitelist_path = os.path.abspath(options.whitelist_file)
+        if not os.path.isfile(whitelist_path):
+            print "--whitelist-file (%s) not found" % (whitelist_path)
+            parser.print_help()
+            return 1
+        elif options.verbose:
+            print "Using whitelist file %s" % (whitelist_path)
+        f = open(whitelist_path, 'r')
+        whitelist_set = set(f.readlines())
+        f.close()
+
     if options.add_all:
         update_all(options.autotest_dir, options.add_noncompliant,
                    options.add_experimental, options.verbose)
     if options.add_samples:
         update_samples(options.autotest_dir, options.add_noncompliant,
-                       options.add_experimental, options.verbose)
-    if options.clear_tests:
-        db_clean_broken(options.autotest_dir, options.verbose)
+                       options.add_experimental, options.verbose,
+                       whitelist_set=whitelist_set)
     if options.tests_dir:
         options.tests_dir = os.path.abspath(options.tests_dir)
         tests = get_tests_from_fs(options.tests_dir,
options.control_pattern,
@@ -380,12 +446,19 @@ def main(argv):
         update_tests_in_db(tests,
add_experimental=options.add_experimental,
                            add_noncompliant=options.add_noncompliant,
                            autotest_dir=options.autotest_dir,
-                           verbose=options.verbose)
+                           verbose=options.verbose,
+                           whitelist_set=whitelist_set)
     if options.profile_dir:
         profilers = get_tests_from_fs(options.profile_dir, '.*py$')
         update_profilers_in_db(profilers, verbose=options.verbose,
                                add_noncompliant=options.add_noncompliant,
-                               description='NA')
+                               description='NA',
whitelist_set=whitelist_set)
+    if options.clear_tests:
+        db_clean_broken(options.autotest_dir, options.verbose)
+        if options.whitelist_file and options.tests_dir:
+            db_clean_from_whitelist(options.autotest_dir, options.verbose,
+                                    options.tests_dir, whitelist_set)
+


 if __name__ == "__main__":
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to