Add pipeline precedence

Allow, eg, jobs in a gate pipeline to take precedence over
a check pipeline.

Change-Id: Idf91527704cc75b00a336291f91b908286f8e630
Reviewed-on: https://review.openstack.org/36552
Reviewed-by: Clark Boylan <clark.boylan@gmail.com>
Reviewed-by: Jeremy Stanley <fungi@yuggoth.org>
Approved: James E. Blair <corvus@inaugust.com>
Tested-by: Jenkins
diff --git a/tests/fixtures/layout.yaml b/tests/fixtures/layout.yaml
index 2695719..37ea552 100644
--- a/tests/fixtures/layout.yaml
+++ b/tests/fixtures/layout.yaml
@@ -31,6 +31,7 @@
       verified: -2
     start:
       verified: 0
+    precedence: high
 
   - name: unused
     manager: IndependentPipelineManager
diff --git a/tests/test_scheduler.py b/tests/test_scheduler.py
index 023ed35..b67e09f 100644
--- a/tests/test_scheduler.py
+++ b/tests/test_scheduler.py
@@ -495,7 +495,8 @@
         self.worker.build_history.append(
             BuildHistory(name=self.name, number=self.number,
                          result=result, changes=changes, node=self.node,
-                         uuid=self.unique, description=self.description)
+                         uuid=self.unique, description=self.description,
+                         pipeline=self.parameters['ZUUL_PIPELINE'])
             )
 
         self.job.sendWorkComplete(json.dumps(data))
@@ -2267,6 +2268,28 @@
         self.assertTrue(re.search("project-test2.*SUCCESS", desc))
         self.assertTrue(re.search("Reported result.*SUCCESS", desc))
 
+    def test_queue_precedence(self):
+        "Test that queue precedence works"
+
+        self.gearman_server.hold_jobs_in_queue = True
+        A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+        self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+        A.addApproval('CRVW', 2)
+        self.fake_gerrit.addEvent(A.addApproval('APRV', 1))
+
+        self.waitUntilSettled()
+        self.gearman_server.hold_jobs_in_queue = False
+        self.gearman_server.release()
+        self.waitUntilSettled()
+
+        self.log.debug(self.history)
+        self.assertEqual(self.history[0].pipeline, 'gate')
+        self.assertEqual(self.history[1].pipeline, 'check')
+        self.assertEqual(self.history[2].pipeline, 'gate')
+        self.assertEqual(self.history[3].pipeline, 'gate')
+        self.assertEqual(self.history[4].pipeline, 'check')
+        self.assertEqual(self.history[5].pipeline, 'check')
+
     def test_json_status(self):
         "Test that we can retrieve JSON status info"
         self.worker.hold_jobs_in_build = True