mirror of
				https://git.launchpad.net/~ubuntu-release/britney/+git/britney2-ubuntu
				synced 2025-10-31 16:44:13 +00:00 
			
		
		
		
	Wraps 'boottest-britney' script for checking status or submitting new jobs.
This commit is contained in:
		
							parent
							
								
									e254cf3625
								
							
						
					
					
						commit
						49f0a5b3ff
					
				
							
								
								
									
										68
									
								
								boottest.py
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								boottest.py
									
									
									
									
									
								
							| @ -14,6 +14,7 @@ | |||||||
| from __future__ import print_function | from __future__ import print_function | ||||||
| 
 | 
 | ||||||
| import os | import os | ||||||
|  | import subprocess | ||||||
| import time | import time | ||||||
| import urllib | import urllib | ||||||
| 
 | 
 | ||||||
| @ -86,10 +87,52 @@ class TouchManifest(object): | |||||||
|         return key in self._manifest |         return key in self._manifest | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class BootTestJenkinsJob(object): | ||||||
|  |     """Boottest - Jenkins **glue**. | ||||||
|  | 
 | ||||||
|  |     Wraps 'boottest/jenkins/boottest-britney' script for: | ||||||
|  | 
 | ||||||
|  |     * 'check' existing boottest job status ('check <binary> <version>') | ||||||
|  |     * 'submit' new boottest jobs ('submit <binary> <version>') | ||||||
|  | 
 | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     script_path = "boottest/jenkins/boottest-britney" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, distribution, series): | ||||||
|  |         self.distribution = distribution | ||||||
|  |         self.series = series | ||||||
|  | 
 | ||||||
|  |     def _run(self, *args): | ||||||
|  |         if not os.path.exists(self.script_path): | ||||||
|  |             print("E: [%s] - Boottest/Jenking glue script missing: %s" % ( | ||||||
|  |                 time.asctime(), self.script_path)) | ||||||
|  |             return '-' | ||||||
|  |         command = [ | ||||||
|  |             self.script_path, | ||||||
|  |             "-d", self.distribution, "-s", self.series, | ||||||
|  |             ] | ||||||
|  |         command.extend(args) | ||||||
|  |         return subprocess.check_output(command).strip() | ||||||
|  | 
 | ||||||
|  |     def get_status(self, name, version): | ||||||
|  |         """Return the current boottest jenkins job status. | ||||||
|  | 
 | ||||||
|  |         Request a boottest attempt if it's new. | ||||||
|  |         """ | ||||||
|  |         try: | ||||||
|  |             status = self._run('check', name, version) | ||||||
|  |         except subprocess.CalledProcessError as err: | ||||||
|  |             status = self._run('submit', name, version) | ||||||
|  |         return status | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class BootTest(object): | class BootTest(object): | ||||||
|     """Boottest criteria for Britney. |     """Boottest criteria for Britney. | ||||||
| 
 | 
 | ||||||
|     TBD! |     Process (update) excuses for the 'boottest' criteria. Request and monitor | ||||||
|  |     boottest attempts (see `BootTestJenkinsJob`) for binaries present in the | ||||||
|  |     phone image manifest (see `TouchManifest`). | ||||||
|     """ |     """ | ||||||
|     VALID_STATUSES = ('PASS', 'SKIPPED') |     VALID_STATUSES = ('PASS', 'SKIPPED') | ||||||
| 
 | 
 | ||||||
| @ -109,26 +152,13 @@ class BootTest(object): | |||||||
|             self.britney.options, "boottest_fetch", "no") == "yes" |             self.britney.options, "boottest_fetch", "no") == "yes" | ||||||
|         self.phone_manifest = TouchManifest( |         self.phone_manifest = TouchManifest( | ||||||
|             self.distribution, self.series, fetch=manifest_fetch) |             self.distribution, self.series, fetch=manifest_fetch) | ||||||
| 
 |         self.dispatcher = BootTestJenkinsJob(self.distribution, self.series) | ||||||
|     def _get_status(self, name, version): |  | ||||||
|         """Return the current boottest status. |  | ||||||
| 
 |  | ||||||
|         Request a boottest attempt if it's new. |  | ||||||
|         """ |  | ||||||
|         # XXX cprov 20150120: replace with the test history latest |  | ||||||
|         # record label, or a new job request if it was not found. |  | ||||||
|         if name == 'pyqt5': |  | ||||||
|             if version == '1.1~beta': |  | ||||||
|                 return 'PASS' |  | ||||||
|             return 'FAIL' |  | ||||||
| 
 |  | ||||||
|         return 'RUNNING' |  | ||||||
| 
 | 
 | ||||||
|     def update(self, excuse): |     def update(self, excuse): | ||||||
|         """Update given 'excuse' and yields testing status. |         """Update given 'excuse' and yields testing status. | ||||||
| 
 | 
 | ||||||
|         Yields (status, binary_name) for each binary considered for the |         Yields (status, binary_name) for each binary considered for the | ||||||
|         given excuse. See `_get_status()`. |         given excuse. See `BootTestJenkinsJob.get_status`. | ||||||
| 
 | 
 | ||||||
|         Binaries are considered for boottesting if they are part of the |         Binaries are considered for boottesting if they are part of the | ||||||
|         phone image manifest. See `TouchManifest`. |         phone image manifest. See `TouchManifest`. | ||||||
| @ -138,8 +168,8 @@ class BootTest(object): | |||||||
|         # Dismiss if source is not yet recognized (??). |         # Dismiss if source is not yet recognized (??). | ||||||
|         if excuse.name not in unstable_sources: |         if excuse.name not in unstable_sources: | ||||||
|             raise StopIteration |             raise StopIteration | ||||||
|         # XXX cprov 20150120: binaries are a seq of "<binname>/<arch>" and, |         # Binaries are a seq of "<binname>/<arch>" and, practically, boottest | ||||||
|         # practically, boottest is only concerned about armhf+all binaries. |         # is only concerned about armhf+all binaries. | ||||||
|         # Anything else should be skipped. |         # Anything else should be skipped. | ||||||
|         binary_names = [ |         binary_names = [ | ||||||
|             b.split('/')[0] |             b.split('/')[0] | ||||||
| @ -150,7 +180,7 @@ class BootTest(object): | |||||||
|         # Process (request or update) boottest attempts for each binary. |         # Process (request or update) boottest attempts for each binary. | ||||||
|         for name in binary_names: |         for name in binary_names: | ||||||
|             if name in self.phone_manifest: |             if name in self.phone_manifest: | ||||||
|                 status = self._get_status(name, excuse.ver[1]) |                 status = self.dispatcher.get_status(name, excuse.ver[1]) | ||||||
|             else: |             else: | ||||||
|                 status = 'SKIPPED' |                 status = 'SKIPPED' | ||||||
|             yield name, status |             yield name, status | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ sys.path.insert(0, PROJECT_DIR) | |||||||
| from tests import TestBase | from tests import TestBase | ||||||
| from boottest import ( | from boottest import ( | ||||||
|     BootTest, |     BootTest, | ||||||
|  |     BootTestJenkinsJob, | ||||||
|     TouchManifest, |     TouchManifest, | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @ -157,10 +158,50 @@ class TestBoottestEnd2End(TestBase): | |||||||
|             'boottest/images/ubuntu/{}'.format(self.data.series)) |             'boottest/images/ubuntu/{}'.format(self.data.series)) | ||||||
|         create_manifest(path, lines) |         create_manifest(path, lines) | ||||||
| 
 | 
 | ||||||
|  |     def make_boottest(self): | ||||||
|  |         """Create a stub version of boottest-britney script.""" | ||||||
|  |         script_path = os.path.join( | ||||||
|  |             self.data.path, 'boottest/jenkins/boottest-britney') | ||||||
|  |         os.makedirs(os.path.dirname(script_path)) | ||||||
|  |         with open(script_path, 'w') as f: | ||||||
|  |             f.write('''#!%(py)s | ||||||
|  | import argparse | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | def submit(): | ||||||
|  |     print 'RUNNING' | ||||||
|  | 
 | ||||||
|  | def check(): | ||||||
|  |     if args.name != 'pyqt5': | ||||||
|  |        sys.exit(100) | ||||||
|  |     if args.version == '1.1~beta': | ||||||
|  |        print 'PASS' | ||||||
|  |     else: | ||||||
|  |        print 'FAIL' | ||||||
|  | 
 | ||||||
|  | p = argparse.ArgumentParser() | ||||||
|  | p.add_argument('-d') | ||||||
|  | p.add_argument('-s') | ||||||
|  | sp = p.add_subparsers() | ||||||
|  | psubmit = sp.add_parser('submit') | ||||||
|  | psubmit.add_argument('name') | ||||||
|  | psubmit.add_argument('version') | ||||||
|  | psubmit.set_defaults(func=submit) | ||||||
|  | pcheck = sp.add_parser('check') | ||||||
|  | pcheck.add_argument('name') | ||||||
|  | pcheck.add_argument('version') | ||||||
|  | pcheck.set_defaults(func=check) | ||||||
|  | 
 | ||||||
|  | args = p.parse_args() | ||||||
|  | args.func() | ||||||
|  |                     ''' % {'py': sys.executable}) | ||||||
|  |         os.chmod(script_path, 0o755) | ||||||
|  | 
 | ||||||
|     def do_test(self, context, expect=None, no_expect=None): |     def do_test(self, context, expect=None, no_expect=None): | ||||||
|         """Process the given package context and assert britney results.""" |         """Process the given package context and assert britney results.""" | ||||||
|         for (pkg, fields) in context: |         for (pkg, fields) in context: | ||||||
|             self.data.add(pkg, True, fields) |             self.data.add(pkg, True, fields) | ||||||
|  |         self.make_boottest() | ||||||
|         (excuses, out) = self.run_britney() |         (excuses, out) = self.run_britney() | ||||||
|         #print('-------\nexcuses: %s\n-----' % excuses) |         #print('-------\nexcuses: %s\n-----' % excuses) | ||||||
|         if expect: |         if expect: | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user