def test_build_complete_triggers(self, storage): m = Mock() m.get_project_definition.return_value = json.dumps({ 'timeout': 5, 'triggers': [ { 'name': 'github', 'type': 'github_pr', 'runs': [{ 'name': 'run0', 'host-tag': 'foo*', }], 'triggers': [ {'name': 'build-trigger'}, ] }, { 'name': 'build-trigger', 'type': 'simple', 'runs': [{ 'name': 'test', 'host-tag': 'foo*', 'container': 'container-foo', 'script': 'test', }], }, ], 'scripts': { 'test': '#test#', } }) m.console_logfd.return_value = open('/dev/null', 'w') m.get_run_definition.return_value = json.dumps({}) m.get_build_params.return_value = {'buildparam': '42'} storage.return_value = m r = Run(self.build, 'run0') r.trigger = 'github' r.status = BuildStatus.RUNNING r.queue_priority = 8675309 db.session.add(r) db.session.commit() headers = [ ('Authorization', 'Token %s' % r.api_key), ('X-RUN-STATUS', 'PASSED'), ] self._post(self.urlbase + 'run0/', None, headers, 200) db.session.refresh(r) run = Run.query.all()[1] self.assertEqual('test', run.name) self.assertEqual('QUEUED', run.status.name) rundef = json.loads(m.set_run_definition.call_args[0][1]) self.assertEqual('42', rundef['env']['buildparam']) self.assertEqual(8675309, run.queue_priority)
def test_worker_queue_priority(self, storage): """Validate queue priorities for Runs are honored. 1. Create a normal project with 2 QUEUED builds. 2. Set the priority of the newer build higher than the older build 3. Verify queue priority is done properly. """ if db.engine.dialect.name == 'sqlite': self.skipTest('Test requires MySQL') rundef = {'run_url': 'foo', 'runner_url': 'foo', 'env': {}} storage().get_run_definition.return_value = json.dumps(rundef) w = Worker('w1', 'ubuntu', 12, 2, 'aarch64', 'key', 2, ['aarch96']) w.enlisted = True w.online = True db.session.add(w) self.create_projects('job-1') p = Project.query.all()[0] p.synchronous_builds = True db.session.commit() b = Build.create(p) r = Run(b, 'r1') r.host_tag = 'aarch96' db.session.add(r) r = Run(b, 'r2') r.host_tag = 'aarch96' r.queue_priority = 2 # this is *newer* build but *higher* priority db.session.add(r) db.session.commit() headers = [ ('Content-type', 'application/json'), ('Authorization', 'Token key'), ] qs = 'available_runners=1&foo=2' resp = self.client.get('/workers/w1/', headers=headers, query_string=qs) self.assertEqual(200, resp.status_code, resp.data) data = json.loads(resp.data.decode()) self.assertEqual(1, len(data['data']['worker']['run-defs'])) self.assertEqual([BuildStatus.QUEUED, BuildStatus.RUNNING], [x.status for x in Run.query])
def test_worker_queue_priority(self, storage): """Validate queue priorities for Runs are honored. 1. Create a normal project with 2 QUEUED builds. 2. Set the priority of the newer build higher than the older build 3. Verify queue priority is done properly. """ if db.engine.dialect.name == "sqlite": self.skipTest("Test requires MySQL") rundef = {"run_url": "foo", "runner_url": "foo", "env": {}} storage().get_run_definition.return_value = json.dumps(rundef) w = Worker("w1", "ubuntu", 12, 2, "aarch64", "key", 2, ["aarch96"]) w.enlisted = True w.online = True db.session.add(w) self.create_projects("job-1") p = Project.query.all()[0] p.synchronous_builds = True db.session.commit() b = Build.create(p) r = Run(b, "r1") r.host_tag = "aarch96" db.session.add(r) r = Run(b, "r2") r.host_tag = "aarch96" r.queue_priority = 2 # this is *newer* build but *higher* priority db.session.add(r) db.session.commit() headers = [ ("Content-type", "application/json"), ("Authorization", "Token key"), ] qs = "available_runners=1&foo=2" resp = self.client.get("/workers/w1/", headers=headers, query_string=qs) self.assertEqual(200, resp.status_code, resp.data) data = json.loads(resp.data.decode()) self.assertEqual(1, len(data["data"]["worker"]["run-defs"])) self.assertEqual([BuildStatus.QUEUED, BuildStatus.RUNNING], [x.status for x in Run.query])
def test_build_complete_triggers(self, storage, notify): class MockStorage: projdef = { "timeout": 5, "triggers": [ { "name": "github", "type": "github_pr", "email": { "users": "*****@*****.**", }, "runs": [{ "name": "run0", "host-tag": "foo*", }], "triggers": [ { "name": "build-trigger" }, ], }, { "name": "build-trigger", "type": "simple", "runs": [{ "name": "test", "host-tag": "foo*", "container": "container-foo", "script": "test", }], }, ], "scripts": { "test": "#test#", }, } @classmethod def get_projdef(cls, build): return yaml.dump(cls.projdef) @classmethod def create_projdef(cls, build, projdef): cls.projdef = yaml.safe_load(projdef) m = Mock() m.get_project_definition = MockStorage.get_projdef m.create_project_definition = MockStorage.create_projdef m.console_logfd.return_value = open("/dev/null", "w") m.get_run_definition.return_value = json.dumps({}) m.get_build_params.return_value = {"buildparam": "42"} storage.return_value = m r = Run(self.build, "run0") r.trigger = "github" r.status = BuildStatus.RUNNING r.queue_priority = 8675309 db.session.add(r) db.session.commit() headers = [ ("Authorization", "Token %s" % r.api_key), ("X-RUN-STATUS", "PASSED"), ] self._post(self.urlbase + "run0/", None, headers, 200) db.session.refresh(r) run = Run.query.all()[1] self.assertEqual("test", run.name) self.assertEqual("QUEUED", run.status.name) rundef = json.loads(m.set_run_definition.call_args[0][1]) self.assertEqual("42", rundef["env"]["buildparam"]) self.assertEqual(8675309, run.queue_priority) headers[0] = ("Authorization", "Token %s" % run.api_key) self._post(self.urlbase + "test/", None, headers, 200) run = Run.query.all()[1] self.assertEqual("test", run.name) self.assertEqual("PASSED", run.status.name) self.assertEqual("PASSED", self.build.status.name) notify.assert_called_once_with(self.build, "*****@*****.**")