diff options
| -rw-r--r-- | bitbake/lib/bb/siggen.py | 23 | ||||
| -rw-r--r-- | bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass | 14 | ||||
| -rw-r--r-- | bitbake/lib/bb/tests/runqueue-tests/conf/bitbake.conf | 2 | ||||
| -rw-r--r-- | bitbake/lib/bb/tests/runqueue.py | 27 |
4 files changed, 59 insertions, 7 deletions
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py index 912c92c8be..b503559305 100644 --- a/bitbake/lib/bb/siggen.py +++ b/bitbake/lib/bb/siggen.py | |||
| @@ -12,6 +12,7 @@ import bb.data | |||
| 12 | import difflib | 12 | import difflib |
| 13 | import simplediff | 13 | import simplediff |
| 14 | from bb.checksum import FileChecksumCache | 14 | from bb.checksum import FileChecksumCache |
| 15 | from bb import runqueue | ||
| 15 | 16 | ||
| 16 | logger = logging.getLogger('BitBake.SigGen') | 17 | logger = logging.getLogger('BitBake.SigGen') |
| 17 | 18 | ||
| @@ -473,10 +474,12 @@ class SignatureGeneratorUniHashMixIn(object): | |||
| 473 | 474 | ||
| 474 | locs = {'path': path, 'sigfile': sigfile, 'task': task, 'd': d} | 475 | locs = {'path': path, 'sigfile': sigfile, 'task': task, 'd': d} |
| 475 | 476 | ||
| 476 | (module, method) = self.method.rsplit('.', 1) | 477 | if "." in self.method: |
| 477 | locs['method'] = getattr(importlib.import_module(module), method) | 478 | (module, method) = self.method.rsplit('.', 1) |
| 478 | 479 | locs['method'] = getattr(importlib.import_module(module), method) | |
| 479 | outhash = bb.utils.better_eval('method(path, sigfile, task, d)', locs) | 480 | outhash = bb.utils.better_eval('method(path, sigfile, task, d)', locs) |
| 481 | else: | ||
| 482 | outhash = bb.utils.better_eval(self.method + '(path, sigfile, task, d)', locs) | ||
| 480 | 483 | ||
| 481 | try: | 484 | try: |
| 482 | url = '%s/v1/equivalent' % self.server | 485 | url = '%s/v1/equivalent' % self.server |
| @@ -527,6 +530,18 @@ class SignatureGeneratorUniHashMixIn(object): | |||
| 527 | except OSError: | 530 | except OSError: |
| 528 | pass | 531 | pass |
| 529 | 532 | ||
| 533 | |||
| 534 | # | ||
| 535 | # Dummy class used for bitbake-selftest | ||
| 536 | # | ||
| 537 | class SignatureGeneratorTestEquivHash(SignatureGeneratorUniHashMixIn, SignatureGeneratorBasicHash): | ||
| 538 | name = "TestEquivHash" | ||
| 539 | def init_rundepcheck(self, data): | ||
| 540 | super().init_rundepcheck(data) | ||
| 541 | self.server = "http://" + data.getVar('BB_HASHSERVE') | ||
| 542 | self.method = "sstate_output_hash" | ||
| 543 | |||
| 544 | |||
| 530 | def dump_this_task(outfile, d): | 545 | def dump_this_task(outfile, d): |
| 531 | import bb.parse | 546 | import bb.parse |
| 532 | fn = d.getVar("BB_FILENAME") | 547 | fn = d.getVar("BB_FILENAME") |
diff --git a/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass b/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass index 3a0f151c9a..138edc3fa9 100644 --- a/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass +++ b/bitbake/lib/bb/tests/runqueue-tests/classes/base.bbclass | |||
| @@ -5,7 +5,8 @@ def stamptask(d): | |||
| 5 | import time | 5 | import time |
| 6 | 6 | ||
| 7 | thistask = d.expand("${PN}:${BB_CURRENTTASK}") | 7 | thistask = d.expand("${PN}:${BB_CURRENTTASK}") |
| 8 | with open(d.expand("${TOPDIR}/%s.run") % thistask, "a+") as f: | 8 | stampname = d.expand("${TOPDIR}/%s.run" % thistask) |
| 9 | with open(stampname, "a+") as f: | ||
| 9 | f.write("\n") | 10 | f.write("\n") |
| 10 | 11 | ||
| 11 | if d.getVar("BB_CURRENT_MC") != "default": | 12 | if d.getVar("BB_CURRENT_MC") != "default": |
| @@ -13,10 +14,21 @@ def stamptask(d): | |||
| 13 | if thistask in d.getVar("SLOWTASKS").split(): | 14 | if thistask in d.getVar("SLOWTASKS").split(): |
| 14 | bb.note("Slowing task %s" % thistask) | 15 | bb.note("Slowing task %s" % thistask) |
| 15 | time.sleep(0.5) | 16 | time.sleep(0.5) |
| 17 | if d.getVar("BB_HASHSERVE"): | ||
| 18 | task = d.getVar("BB_CURRENTTASK") | ||
| 19 | if task in ['package', 'package_qa', 'packagedata', 'package_write_ipk', 'package_write_rpm', 'populate_lic', 'populate_sysroot']: | ||
| 20 | bb.parse.siggen.report_unihash(os.getcwd(), d.getVar("BB_CURRENTTASK"), d) | ||
| 16 | 21 | ||
| 17 | with open(d.expand("${TOPDIR}/task.log"), "a+") as f: | 22 | with open(d.expand("${TOPDIR}/task.log"), "a+") as f: |
| 18 | f.write(thistask + "\n") | 23 | f.write(thistask + "\n") |
| 19 | 24 | ||
| 25 | |||
| 26 | def sstate_output_hash(path, sigfile, task, d): | ||
| 27 | import hashlib | ||
| 28 | h = hashlib.sha256() | ||
| 29 | h.update(d.expand("${PN}:${BB_CURRENTTASK}").encode('utf-8')) | ||
| 30 | return h.hexdigest() | ||
| 31 | |||
| 20 | python do_fetch() { | 32 | python do_fetch() { |
| 21 | # fetch | 33 | # fetch |
| 22 | stamptask(d) | 34 | stamptask(d) |
diff --git a/bitbake/lib/bb/tests/runqueue-tests/conf/bitbake.conf b/bitbake/lib/bb/tests/runqueue-tests/conf/bitbake.conf index 96ee1cd5ec..1c61f27607 100644 --- a/bitbake/lib/bb/tests/runqueue-tests/conf/bitbake.conf +++ b/bitbake/lib/bb/tests/runqueue-tests/conf/bitbake.conf | |||
| @@ -11,6 +11,6 @@ STAMP = "${TMPDIR}/stamps/${PN}" | |||
| 11 | T = "${TMPDIR}/workdir/${PN}/temp" | 11 | T = "${TMPDIR}/workdir/${PN}/temp" |
| 12 | BB_NUMBER_THREADS = "4" | 12 | BB_NUMBER_THREADS = "4" |
| 13 | 13 | ||
| 14 | BB_HASHBASE_WHITELIST = "BB_CURRENT_MC" | 14 | BB_HASHBASE_WHITELIST = "BB_CURRENT_MC BB_HASHSERVE" |
| 15 | 15 | ||
| 16 | include conf/multiconfig/${BB_CURRENT_MC}.conf | 16 | include conf/multiconfig/${BB_CURRENT_MC}.conf |
diff --git a/bitbake/lib/bb/tests/runqueue.py b/bitbake/lib/bb/tests/runqueue.py index f22ad4bd81..fbdacccfa1 100644 --- a/bitbake/lib/bb/tests/runqueue.py +++ b/bitbake/lib/bb/tests/runqueue.py | |||
| @@ -25,7 +25,7 @@ class RunQueueTests(unittest.TestCase): | |||
| 25 | a1_sstatevalid = "a1:do_package a1:do_package_qa a1:do_packagedata a1:do_package_write_ipk a1:do_package_write_rpm a1:do_populate_lic a1:do_populate_sysroot" | 25 | a1_sstatevalid = "a1:do_package a1:do_package_qa a1:do_packagedata a1:do_package_write_ipk a1:do_package_write_rpm a1:do_populate_lic a1:do_populate_sysroot" |
| 26 | b1_sstatevalid = "b1:do_package b1:do_package_qa b1:do_packagedata b1:do_package_write_ipk b1:do_package_write_rpm b1:do_populate_lic b1:do_populate_sysroot" | 26 | b1_sstatevalid = "b1:do_package b1:do_package_qa b1:do_packagedata b1:do_package_write_ipk b1:do_package_write_rpm b1:do_populate_lic b1:do_populate_sysroot" |
| 27 | 27 | ||
| 28 | def run_bitbakecmd(self, cmd, builddir, sstatevalid="", slowtasks="", extraenv=None): | 28 | def run_bitbakecmd(self, cmd, builddir, sstatevalid="", slowtasks="", extraenv=None, cleanup=False): |
| 29 | env = os.environ.copy() | 29 | env = os.environ.copy() |
| 30 | env["BBPATH"] = os.path.realpath(os.path.join(os.path.dirname(__file__), "runqueue-tests")) | 30 | env["BBPATH"] = os.path.realpath(os.path.join(os.path.dirname(__file__), "runqueue-tests")) |
| 31 | env["BB_ENV_EXTRAWHITE"] = "SSTATEVALID SLOWTASKS" | 31 | env["BB_ENV_EXTRAWHITE"] = "SSTATEVALID SLOWTASKS" |
| @@ -42,6 +42,8 @@ class RunQueueTests(unittest.TestCase): | |||
| 42 | tasks = [] | 42 | tasks = [] |
| 43 | with open(builddir + "/task.log", "r") as f: | 43 | with open(builddir + "/task.log", "r") as f: |
| 44 | tasks = [line.rstrip() for line in f] | 44 | tasks = [line.rstrip() for line in f] |
| 45 | if cleanup: | ||
| 46 | os.remove(builddir + "/task.log") | ||
| 45 | return tasks | 47 | return tasks |
| 46 | 48 | ||
| 47 | def test_no_setscenevalid(self): | 49 | def test_no_setscenevalid(self): |
| @@ -226,3 +228,26 @@ class RunQueueTests(unittest.TestCase): | |||
| 226 | expected.remove(x) | 228 | expected.remove(x) |
| 227 | self.assertEqual(set(tasks), set(expected)) | 229 | self.assertEqual(set(tasks), set(expected)) |
| 228 | 230 | ||
| 231 | |||
| 232 | def test_hashserv(self): | ||
| 233 | with tempfile.TemporaryDirectory(prefix="runqueuetest") as tempdir: | ||
| 234 | extraenv = { | ||
| 235 | "BB_HASHSERVE" : "localhost:0", | ||
| 236 | "BB_SIGNATURE_HANDLER" : "TestEquivHash" | ||
| 237 | } | ||
| 238 | cmd = ["bitbake", "a1", "b1"] | ||
| 239 | setscenetasks = ['package_write_ipk_setscene', 'package_write_rpm_setscene', 'packagedata_setscene', | ||
| 240 | 'populate_sysroot_setscene', 'package_qa_setscene'] | ||
| 241 | sstatevalid = "" | ||
| 242 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True) | ||
| 243 | expected = ['a1:' + x for x in self.alltasks] + ['b1:' + x for x in self.alltasks] | ||
| 244 | self.assertEqual(set(tasks), set(expected)) | ||
| 245 | cmd = ["bitbake", "a1", "-c", "install", "-f"] | ||
| 246 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True) | ||
| 247 | expected = ['a1:install'] | ||
| 248 | self.assertEqual(set(tasks), set(expected)) | ||
| 249 | cmd = ["bitbake", "a1", "b1"] | ||
| 250 | tasks = self.run_bitbakecmd(cmd, tempdir, sstatevalid, extraenv=extraenv, cleanup=True) | ||
| 251 | expected = ['a1:' + x for x in setscenetasks] + ['b1:' + x for x in setscenetasks] + ['a1:build', 'b1:build'] | ||
| 252 | self.assertEqual(set(tasks), set(expected)) | ||
| 253 | |||
