Add a new command-line option to allow users to specify a kernel config_file
as previously the only way to do so would require them to specify a control
file with the kernel_list specified.  Intent is to make it easier to specify
both a kernel version and config_file for basic tests.

The new option accepts a comma separated list that is expected to match the
number of entries specifed in the --kernel option.

Signed-off-by: Daniel DeFolo <daniel.def...@hp.com>
---
 cli/job.py          |   47 +++++++++++++++++++++++++++++++---
 cli/job_unittest.py |   68 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 110 insertions(+), 5 deletions(-)

diff --git a/cli/job.py b/cli/job.py
index 2b3dac0..c044b03 100644
--- a/cli/job.py
+++ b/cli/job.py
@@ -356,6 +356,7 @@ class job_create(job_create_or_clone):
     """atest job create [--priority <Low|Medium|High|Urgent>]
     [--synch_count] [--control-file </path/to/cfile>]
     [--on-server] [--test <test1,test2>] [--kernel <http://kernel>]
+    [--kernel-config <http://kernel-config-file]
     [--mlist </path/to/machinelist>] [--machine <host1 host2 host3>]
     [--labels <list of labels of machines to run on>]
     [--reboot_before <option>] [--reboot_after <option>]
@@ -387,6 +388,10 @@ class job_create(job_create_or_clone):
         self.parser.add_option('-k', '--kernel', help='A comma separated list'
                                ' of kernel versions/URLs/filenames to run the'
                                ' job on')
+        self.parser.add_option('--kernel-config', help='A comma separated list'
+                               ' of kernel config URLs/filenames to run the'
+                               ' job on.  Entries will be paired (in order)'
+                               ' with values provided in the --kernel option')
         self.parser.add_option('--kernel-cmdline', help='A string that will be'
                                ' given as cmdline to the booted kernel(s)'
                                ' specified by the -k option')
@@ -425,14 +430,44 @@ class job_create(job_create_or_clone):
                                help='Job maximum runtime in hours')
 
 
-    @staticmethod
-    def _get_kernel_data(kernel_list, cmdline):
-        # the RPC supports cmdline per kernel version in a dictionary
-        kernels = []
+    def _get_kernel_data(self, kernel_list, cmdline, config_list=None):
+        """ Combine CLI options for kernel_list, cmdline, and config_list
+        into a list of dictionary entries (the RPC requires version,
+        with optional entries for config_file and cmdline).
+
+        If a config_list is specified, it must have the same number of
+        entries as the kernel_list.
+
+        If a cmdline is specified, it will be associated with each entry
+        in the kernel_list
+        """
+        configs = []
+        versions = []
+        if (config_list):
+            for config in re.split(r'[, ]+', config_list):
+                if not config:
+                    continue
+                if (config.lower() == 'none'):
+                    configs.append(None)
+                else:
+                    configs.append(config)
+
         for version in re.split(r'[, ]+', kernel_list):
             if not version:
                 continue
+            versions.append(version)
+            if (config_list is None):
+                configs.append(None)
+
+        if (len(configs) != len(versions)):
+            self.invalid_syntax('Must specify same number of entries in'
+                                ' --kernel and --kernel-config options');
+
+        kernels = []
+        for version, config in zip(versions, configs):
             kernel_info = {'version': version}
+            if config:
+                kernel_info['config_file'] = config
             if cmdline:
                 kernel_info['cmdline'] = cmdline
             kernels.append(kernel_info)
@@ -459,7 +494,9 @@ class job_create(job_create_or_clone):
                                 '--test, not both.')
         if options.kernel:
             self.ctrl_file_data['kernel'] = self._get_kernel_data(
-                    options.kernel, options.kernel_cmdline)
+                    options.kernel,
+                    options.kernel_cmdline,
+                    config_list=options.kernel_config)
         if options.control_file:
             try:
                 control_file_f = open(options.control_file)
diff --git a/cli/job_unittest.py b/cli/job_unittest.py
index 760570d..d08be16 100755
--- a/cli/job_unittest.py
+++ b/cli/job_unittest.py
@@ -938,6 +938,61 @@ class job_create_unittest(cli_mock.cli_unittest):
                      out_words_ok=['test_job0', 'Created',
                                    'Uploading', 'Done'])
 
+    def test_execute_create_job_with_2kernels_and_2config(self):
+        data = self.data.copy()
+        data['control_file'] = self.kernel_ctrl_file
+        self.run_cmd(argv=['atest', 'job', 'create', '-t', 'sleeptest',
+                           '-k', 'kernel1,kernel2',
+                           '--kernel-config', 'config1,config2',
+                           '--kernel-cmdline','arg1 arg2',
+                           'test_job0', '-m', 'host0', '--ignore_site_file'],
+                     rpcs=[('generate_control_file',
+                            {'tests': ['sleeptest'],
+                             'kernel': [{'version': 'kernel1',
+                                         'config_file': 'config1',
+                                         'cmdline': 'arg1 arg2'},
+                                        {'version': 'kernel2',
+                                         'config_file': 'config2',
+                                         'cmdline': 'arg1 arg2'}]
+                             },
+                            True,
+                            {'control_file' : self.kernel_ctrl_file,
+                             'synch_count' : 1,
+                             'is_server' : False,
+                             'dependencies' : []}),
+                           ('create_job', data, True, 180)],
+                     out_words_ok=['test_job0', 'Created',
+                                   'Uploading', 'Done'])
+
+
+    def test_execute_create_job_with_3kernels_and_explicit_none_config(self):
+        data = self.data.copy()
+        data['control_file'] = self.kernel_ctrl_file
+        self.run_cmd(argv=['atest', 'job', 'create', '-t', 'sleeptest',
+                           '-k', 'kernel1,kernel2,kernel3',
+                           '--kernel-config', 'config1,none,config3',
+                           '--kernel-cmdline','arg1 arg2',
+                           'test_job0', '-m', 'host0', '--ignore_site_file'],
+                     rpcs=[('generate_control_file',
+                            {'tests': ['sleeptest'],
+                             'kernel': [{'version': 'kernel1',
+                                         'config_file': 'config1',
+                                         'cmdline': 'arg1 arg2'},
+                                        {'version': 'kernel2',
+                                         'cmdline': 'arg1 arg2'},
+                                        {'version': 'kernel3',
+                                         'config_file': 'config3',
+                                         'cmdline': 'arg1 arg2'}]
+                             },
+                            True,
+                            {'control_file' : self.kernel_ctrl_file,
+                             'synch_count' : 1,
+                             'is_server' : False,
+                             'dependencies' : []}),
+                           ('create_job', data, True, 180)],
+                     out_words_ok=['test_job0', 'Created',
+                                   'Uploading', 'Done'])
+
 
     def test_execute_create_job_with_kernel_spaces(self):
         data = self.data.copy()
@@ -1015,6 +1070,19 @@ class job_create_unittest(cli_mock.cli_unittest):
         self.god.check_playback()
 
 
+    def test_execute_create_job_more_kernels_than_configs(self):
+        testjob = job.job_create()
+        sys.argv = ['atest', 'job', 'create', '-f', 'control_file', '-k',
+                    'kernel1,kernel2', '--kernel-config', 'config1',
+                    'test_job0', '-m', 'host0', '--ignore_site_file']
+        self.god.mock_io()
+        (sys.exit.expect_call(mock.anything_comparator())
+         .and_raises(cli_mock.ExitException))
+        self.assertRaises(cli_mock.ExitException, testjob.parse)
+        self.god.unmock_io()
+        self.god.check_playback()
+
+
     def test_execute_create_job_bad_cfile(self):
         testjob = job.job_create()
         sys.argv = ['atest', 'job', 'create', '-f', 'control_file',
-- 
1.7.7.6

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

Reply via email to